Реферат: ЯЗЫК МАКРОАССЕМБЛЕРА IBM PC
MOV [BX],CL
При записи команд в символьной форме необходимо внимательно следить за правильным указанием типа (размера) операндов, чтобы не было ошибок. Тип обычно определяется по внешнему виду одного из них, например:
MOV AH,5 ;пересылка байта, т.к. AH - байтовый регистр
MOV AX,5 ;пересылка слова, т.к. AX - 16-битовый регистр
;(операнд 5 может быть байтом и словом, по нему ;нельзя определить размер пересылаемой величины)
MOV [BX],300 ;пересылка слова, т.к. число 300 не может быть ;байтом
Если по внешнему виду можно однозначно определить тип обоих операндов, тогда эти типы должны совпадать, иначе ассемблер зафиксирует ошибку. Примеры:
MOV DS,AX ;оба операнда имеют размер слова
MOV CX,BH ;ошибка: регистры CX и BH имеют разные размеры
MOV DL,300 ;ошибка: DL - байтовый регистр, а число 300 не ;может быть байтом
Возможны ситуации, когда по внешнему виду операндов нельзя определить тип ни одного из них, как, например, в команде
MOV [BX],5
Здесь число 5 может быть и байтом, и словом, а адрес из регистра BX может указывать и на байт памяти, и на слово. В подобных ситуациях ассемблер фиксирует ошибку. Чтобы избежать ее, надо уточнить тип одного из операндов с помощью оператора с названием PTR:
MOV BYTE PTR [BX],5 ;пересылка байта
MOV WORD PTR [BX],5 ;пересылка слова
(Операторы - это разновидность выражений языка MASM, аналогичные функциям.)
Оператор PTR необходим и в том случае, когда надо изменить тип, предписанный имени при его описании. Если, например, X описано как имя переменной размером в слово:
X DW 999
и если надо записать в байтовый регистр AH значение только первого байта этого слова, тогда воспользоваться командой
MOV AH,X
нельзя, т.к. ее операнды имеют разный размер. Эту команду следует записать несколько иначе:
MOV AH,BYTE PTR X
Здесь конструкция BYTE PTR X означает адрес X, но уже рассматриваемый не как адрес слова, а как адрес байта. (Напомним, что с одного и того же адреса может начинаться байт, слово и двойное слово; оператор PTR
уточняет, ячейку какого размера мы имеем в виду.)
И еще одно замечание. Если в символьной команде, оперирующей со словами, указан непосредственный операнд размером в байт, как, например, в команде
MOV AX,80h
то возникает некоторая неоднозначность: что будет записано в регистр AX - число 0080h (+128) или 0FF80h (-128)? В подобных ситуациях ассемблер формирует машинную команду, где операнд-байт расширен до слова, причем расширение происходит со знаком, если операнд был записан как отрицательное число, и без знака в остальных случаях. Например:
MOV AX,-128 ; => MOV AX,0FF80h (A:=-128)
MOV AX,128 ; => MOV AX,0080h (A:=+128) MOV AX,80h ; => MOV AX,0080h (A:=+128)
1.4. СЕГМЕНТИРОВНИЕ