В общем нужно решить контрольную работу по ассемблеру. Сделал всё кроме одного задания. Не в одной книжке не нашёл толкового описания что такое BYTE PTR и WORD PTR. Объясните плиз. Вот задание: ЗЫ: Самое интересное что я не нашёл не одного нормального форума по ассемблеру!!!!! Если кто знает – подскажите
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Надо указать конкретно к байту или слову добавляешь, т.е. либо ADD BYTE PTR [BX + 6], 4 или ADD WORD PTR [BX + 6], 4 нельзя использовать DX для адресации. И второй аргумент не указан (слагаемое). Исправить можно на такое: ADD BYTE PTR [BX + 1], 4 CX нельзя использовать для адресации Надо так: MOV BYTE PTR [BX + 4], 12 AX нельзя использовать для адресации Надо так: ADD WORD PTR [BX + 4], 425 AX нельзя использовать для адресации Надо что-то типа MOV AX, [BX + 4] 1)DX нельзя использовать для адресации 2)нельзя делить на память адресованную по регистру (будь это даже не DX, а BX) надо сначала извлечь байт по указанному адресу, а потом делить на него: MOV CL, BYTE PTR [BX + 2] DIV CL
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Вообще для косвенной адресации можно использовать регистры BX, SI, DI, BP Но если вам про регистры SI, DI, BP не рассказывали (а нам в СФ МЭИ про них не рассказывали), то лучше не выпендриваться и использовать везде BX чтобы меньше препод придирался.
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Видимо речь идет про ассемблер под DOS. В нем я конечно не силен. Однако под Windows вроде бы без разницы какой регистр использовать для адрессации, по крайней мере ESI, EDI, EAX и ECX я лично прекрасно юзал. Со всем остальным согласен. По поводу форума, интересно чем ты искал... Короче www.wasm.ru и будет тебе счастье. Ну и еще <a href='http://forum.sources.ru' target='_blank'>http://forum.sources.ru</a> тут есть раздел по низкоуровнему программингу. BYTE PTR, WORD PTR, DWORD PTR, QWORD PTR -- размер данных который ты пользуешь с этого адреса памяти. Соответственно: Байт, слово, двойное слово, четверное слово.
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Георгий, Огромное спасибо! Но всё же объясните в двух словах что обозначают команды BYTE PTR и WORD PTR? Что значит к байту или слову ? в ячейке памяти же вроде только байт может храниться...... или я не прав?
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Vastey, в ячейке памяти же вроде только байт может храниться...... или я не прав?
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Andrnow, ну вот смотри, допустим начиная с адреса BX у тебя лежит такая последовательность байт: 56 61 73 74 65 79 00 00 00 mov al, BYTE PTR [BX] -- AL == 56 mov ax, WORD PTR [BX] -- AX == 6156 mov eax, DWORD PTR [BX] -- EAX == 74736156 А в ячейке естественно лежит 1 байт.
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Когда ты пишешь ADD [BX + 6], 4 то при трансляции транслятору TASM будет непонятно то ли ты хочешь добавить 4 к одной ячейке памяти по адресу [BX + 6] то ли к двум (поскольку процессор 8086 шестнадцатиразрядный, то в нем можно проводить операции сразу с двухбайтовыми данными (словами)). Для случая под виндовс еще добавляются DWORD PTR, QWORD PTR, но это не наш случай, поэтому не забивай этим голову. Для нашего случая (процессор Intel 8086) есть только BYTE PTR и WORD PTR и нужно указывать когда это неочевидно хотим мы провести операцию с байтом или словом. Для случая MOV AX, [BX + 4] ничего указывать не надо, т.к. аргумент слева (регистр AX) 16-разрядный, поэтому транслятору понятно, что мы хотим прибавить к регистру AX именно СЛОВО из памяти расположенное по адресу [BX + 4] где по адресу [BX + 4] расположен младший байт, а по адресу [BX + 5] - старший байт этого слова. А вот для случая ADD [BX + 1], 4 надо указать конкретно BYTE или WORD поскольку транслятор (если представить это в шестнадцаричной записи) может понять как ADD [BX + 1], 04h и как ADD [BX + 1], 0004h и словом BYTE или WORD мы ему указываем конкретно добавлять 04h или 0004h И кстати еще поправка на эту тему для случая ADD WORD PTR [AX + 4], 425 Я написал что надо делать так: ADD WORD PTR [BX + 4], 425 Хотя реально должен проходить вариант и без указания WORD PTR: ADD [BX + 4], 425 потому что аргумент справа (число 425) больше 255 и не помещается в байт, а значит УМНЫЙ транслятор поймет, что речь идет о двух байтах (WORD).
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Считаю, что Vastey на конкретном примере выше вполне доходчиво обяснил.
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P О точно! Торможу... Речь про TASM, а я на MASMе пишу... Конечно сути адресации это не меняет, но небольшие расхождения с тем, что пишет Георгий могут быть. В таком случае его слушай
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Существенно сути не меняет. Я и MASM использовал и TASM - разница может и есть, но я не помню в чем, ибо было это лет 10-15 назад. Поэтому конкретно про последний случай ADD WORD PTR [BX + 4], 425 нужно пробовать и экспериментировать с транслятором. Возможно кто-то примет вариант ADD [BX + 4], 425 а кто-то может warning выдать и потребуется написать конкретно ADD WORD PTR [BX + 4], 425
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Спасибо! Всё понял! ЗЫ: а я пишу в DEBUGе
re:бУУЕНВМЕТ. рПНПЗЙФЕ ТБЪПВТБФШУС У ЛПНБОДБНЙ BYTE Й WORD P Andrnow, BYTE PTR и WORD PTR указывают на то, что адресуется память, а не конкретное числовое значение значение или регистр. BYTE PTR -- это указатель на один байт, WORD PTR -- это указатель на слово (два байта).