Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

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

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

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

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

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

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

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

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

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

Названия этих операторов расшифровываются следующим образом: Е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

ЕNDI F

ENDМ

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

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

SCALE EQU 1010b

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

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

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

 



Поделиться:


Последнее изменение этой страницы: 2016-12-13; просмотров: 190; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.201.92 (0.007 с.)