- •Методические указания
- •«Моделирование программы гипотетической машины с помощью макросредств»
- •1.Введение.
- •2.Пример выполнения курсовой работы.
- •2.1.Задание.
- •2.2.Анализ задачи и разработка алгоритма.
- •2.3.Разработка программы для гм.
- •2.3.1. Определение данных.
- •2.3.2.Определие команд гм.
- •2.4.Моделирование программы гм на реальной эвм.
- •2.4.1.Выборка и запиь слов гм.
- •2.4.2. Макроопрделения для команд гм.
- •2.5.Технология подготовки программы к выполнению и ее отладка.
- •2.6. Результаты работы программы
- •3. Варианты курсовой работы
- •4.Приложения
- •2. Блоки повторения
- •2.1. Rept-блоки
- •Irpc-блоки
- •2.4 Макрооператоры
- •3. Макросы
- •113.1. Макроопределения
- •3.1. Макрокоманды
- •3. 3. Макроподстановки и макрорасширения
- •3. 5. Макросы и процедуры
- •3. 6. Определение макроса через макрос
- •3.7. Директива local
- •113.8. Директива ехiтм
- •3. 9. Переопределение и отмена макросов
- •4. Условное ассемблирование
- •4. 1. Директивы if и ife
- •4.2. Операторы отношения. Логические операторы
- •4.3. Директивы ifidn ,ifdif , ifb и ifnb
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
Другими словами, эти операторы выполняются аналогично одноименным командам ПК. Однако не следует путать эти операторы и команды: операторы используются для записи операндов команд и директив и вычисляются еще на этапе трансляции программы (в машинной программе их уже нет), а команды выполняются на этапе счета программы.