Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 148

Unknown Author

В качестве примера на использование операторов отношения опишем в виде макроса SETO X действие Х:=0 при условии, что X - имя переменной размером в байт, слово или двойное слово:

SETO MACRO X

IF TYPE X EQ DWORD    ;; двойное слово (тип X равен 4) ?

MOV WORD PTR X,0

MOV WORD PTR X+2,0

ELSE    ;;байт или слово

MOV X,0 END IF ENDM

#

Логические значения и отношения можно объединять в более сложные логические выражения с помощью следующих логических операторов:

Эти операторы реализуют соответственно операции отрицания, конъюнкции, дизъюнкции и ’’исключающего ИЛИ’’.

В качестве примера опишем в виде макроса RSH B,N сдвиг значения байтовой переменной В на N разрядов вправо при условии, что N - явно заданное неотрицательное число. Мы не будем выделять особо случай N=1, когда сдвиг можно осуществить одной командой, однако учтем, что при N=0 сдвиг не нужен (макрорасширение должно быть пустым), а при N>7 результат сдвига известен заранее (это 0), поэтому сдвиг можно заменить записью нуля в В. С учетом этого получаем такое макроопределение:

RSH MACRO B,N

IF (N GT 0) AND (N LT 8)    ;; 0<N<8 ?

MOV CL,N SHR B,CL ELSE

IF N GE 8    ;; N>*8 ?

MOV B,0

END IF END IF ENDM

Теперь уточним действия логических операторов. По смыслу их операндами, конечно, должны быть логические выражения, однако в ЯА ими могут быть и любые другие константные выражения (но не адресные), значения которых трактуются как 16-битовые слова. Значением этих операторов также является 16-битовое слово, которое получается в результате поразрядного выполнения соответствующей операции (i-й бит результата определяется только i-ми битами операндов). Например:

SCALE EQTJ 1010b

MOV АХ,SCALE AND lib    ;эквивалентно MOV AX, 10b

AND AX,SCALE XOR lib    ;эквивалентно AND AX,1001b

рутами словами, эти операторы выполняются аналогично одноименным командам ПК. Однако не следует путать эти операторы и команды: операторы ^пользуются для записи операндов команд и директив и вычисляются еще # этапе трансляции программы (в машинной программе их уже нет), а команды дополняются на этапе счета программы.

11.43. Директивы IFIDN, IFDIF, IFB и IFNB

Вернемся к IF-директивам и следующей рассмотрим такую пару директив:

IFIDN <tl>,<t2>

IFDIF <tl>,<t2>

Здесь tl и t2 - любые тексты (последовательности символов), причем они збязательно должны быть заключены в уголки. Эти тексты посимвольно ;равниваются. В директиве IFIDN условие считается выполненным, если эти гексты равны (идентичны, identical), а в директиве IFDIF - если они не равны [различны, different). Отметим, что при сравнении этих текстов большие и малые зуквы не отождествляются.