Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсач гофаров 5 вариант.doc
Скачиваний:
6
Добавлен:
03.05.2019
Размер:
608.77 Кб
Скачать

4.2. Операторы отношения. Логические операторы

В общем случае константное выражение, указываемое в директивах IF и IFЕ, может быть любым, но по смыслу оно, конечно, должно быть логическим выраже­нием. До сих пор мы рассматривали только арифметические (числовые) выраже­ния ЯА, а теперь рассмотрим, как записываются логические выражения. Они счи­таются частным случаем константных выражений "вообще", поэтому, хотя в основ­ном используются в конструкциях макроязыка, принадлежат все же "чистому" ЯА.

Прежде всего отметим, что в ЯА "ложью" считается число 0, а "истиной" считается число -1 (0FFFFh).

В ЯА имеется шесть операторов отношения:

<выражение> ЕQ <выражение>

<выражение> NЕ <выражение>

<выражение> LТ <выражение>

<выражение> LЕ <выражение>

<выражение> GТ <выражение>

<выражение> GЕ <выражение>

Названия этих операторов расшифровываются следующим образом: ЕQ (equal) -равно, NE (not equal) - не равно, LТ (less or than) - меньше, LЕ (less оr equal!) -меньше или равно, GТ (greater or than) - больше, GЕ (greater оr equal) - больше или равно. Оба операнда должны быть либо константными выражениями, либо адресными выражениями, значениями которых обязаны быть адреса из одного и того же сегмента памяти. Если проверяемое отношение выполняется, то значением оператора является "истина", не выполняется - "ложь". Например, если константа N имеет значение 5, тогда:

N+1 LT 5  0 (ложь)

N-1 LT 5  -1 (истина)

Следует, однако, отметить, что действия этих операторов слегка "заумны". Операторы ЕQ и NE трактуют свои операнды как 16-битовые знаковые числа в дополнительном коде, поэтому выражение -2 EQ 0FFFEh оказывается истинным. Остальные же операторы отношения правильно учитывают знаки своих операндов (например, отношение -1 LТ 0FFFЕh истинно), кроме одного случая: если сравниваемые операнды равны как 16-битовые знаковые числа в дополнительном коде, то эти операторы считают их равными (например, отношение -1 LЕ 0FFFFh считается ложным). Учитывая подобные "фокусы", лучше не использовать отрицательные числа в этих операторах.

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

SET0 MACRO X

IF TYPE X EQ DWORD ;; двойное слово

MOV WORD PTR X,0

MOV WORD РТR Х+2 , 0

ЕLSE ;; байт или слово

MOV Х,0

ENDIF

ЕNDМ

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

NОТ <константное выражение>

<константное выражение> АND <константное выражение>

<константное выражение> ОR <константное выражение>

<константное выражение> ХОR<константное выражение>

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

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

RSH MACRO B,N

IF (N GТ 0) АND (N LT 8) ;; 0<N<8 ?

MOV CL,N

SHR B,CL

ЕLSЕ

IF N GЕ 8 ;; N>=8 ?

МОV В, 0

ЕNDIF

ЕNDIF

ENDМ

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

i-ми битами операндов). Например:

SCALE EQU 1010b

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

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

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