рые автоматически настраиваются на конкретную среду функциониро-
вания (например, определение размера области данных для запомина-
ния резервной области памяти). Однако, используя операторы
отношений, MASM не всегда выполняет то, что планировалось.
Работая с целыми со знаком, вы можете посчитать OFFFFh и -1 за
одно и то же значение. За некоторым исключением MASM также ис-
пользует взаимозаменяемость значений. Хотя ранние версии MASM при
работе с отрицательными числами имели некоторые сложности, более
новые версии (1.2 и выше) знают, что -1 равно 0FFFFh, однако при
сравнении величин двух чисел MASM рассматривает их по-разному.
Это иллюстрирует следующий пример:
True FFFF dw 1 gt -1 очевидно
False 0000 dw 1 gt 0FFFFh 65535, а не -1
True FFFF dw -1 ge 0FFFFh -1=-1
False 0000 dw -1 gt 0FFFFh -1 не больше -1
В примере показано, что MASM рассматривает 0FFFFh как положи-
тельное целое число 65535, однако при сравнении с -1 0FFFFh ин-
терпретируется как -1. Об этом можно заметить: "Кто предостере-
жен, тот вооружен".
Полный список операторов отношений приведен в Табл. 1-5. При-
- 1-20 -
мер использования этих операторов при программировании макрост-
руктур помещен в конце данной главы. В Табл. 1-6 приведен список
директив условного ассемблирования.
Таблица 1-5. Логические операторы и операторы отношений
условного ассемблирования
------------------------------------------------------------
Оператор Синтаксис Описание применения
------------------------------------------------------------
EQ exp1 EQ exp2 TRUE,если выражение1 равно вы-
ражению2
NE exp1 NE exp2 TRUE,если выражение1 не равно
выражению2
LT exp1 LT ехр2 TRUE,если выражение1 меньше
выражения2
LE exp1 LE exp2 TRUE,если выражение1 меньше
или равно выражению 2
GT exp1 GT exp2 TRUE,если выражение1 больше
выражения2
GE exp1 GE exp2 TRUE,если выражение1 больше
или равно выражению2
NOT NOT exp TRUE,если выражение - FALSE,
иначе FALSE
AND exp1 AND exp2 TRUE,если только оба выражение1
и выражение2 - TRUE
OR exp1 OR exp2 TRUE,если выражение1 либо выра-
жение2 - TRUE
XOR exp1 XOR exp2 TRUE,если выражение1 равно лог.
NOT от выражения2
FALSE (0000 16-CC) Для IF TRUE любое нулевое выра-
жение - FALSE
TRUE (FFFF 16-CC) Для IF TRUE любoe ненулевое вы-
ражение - TRUE
---------------------------------------------------------
Таблица 1-6. Список директив условного ассемблирования
---------------------------------------------------------
Директива Описание применения
---------------------------------------------------------
.LFCOND Приводит список ассемблерных условий, со-
ответствующих FALSE.
.SFCOND Подавляет выдачу списка условий, соответ-
ствующих FALSE. По умолчанию устанавлива-
ется .SFCOND.
.TFCOND Включает список условного ассемблирования
FALSE аналогично переключателю MASM /X.
Действует независимо от переключателей
.LFCOND и .SFCOND.
.LIST Приводит список исходных строк. Противо-
положно .ХLIST, но не изменяет характерис-
тик листинга условного ассемблирования,
определенных .LFCOND,.SFCOND или .TFCOND.
.XLIST Подавляет любую выдачу. Перекрывает все
предыдущие директивы.
------------------------------------------------------------
- 1-21 -
Условное ассемблирование. Выводы
Кратко ознакомившись с условным ассемблированием, мы увидели,
как можно управлять включением в программу тех или иных операто-
ров. В этом плане мы рассмотрели применение условного ассемблиро-
вания для облегчения процесса включения дополнительных частей
программы.
Но мы затронули только часть проблемы. В наших примерах была
разобрана только одна из десяти возможных форм применения услов-
ных операторов. Где еще могут применяться эти операторы? Прежде
всего они могут применяться в макросах. К рассмотрению этой темы
мы теперь и переходим.
Условное ассемблирование и МАКРОСЫ
Хотя условное ассемблирование часто используется с определен-
ными явно ключами, основной потенциал условного ассемблирования
реализуется при его сочетании с возможностью макрокаманд. Сущест-
вует целый набор возможностей условного ассемблирования, которые
специально ориентированы на работу с макрокомандами. Рассмотрим
основные из этих возможностей.
Макросы могут быть разделены на две группы. В первую группу
входят макросы, ориентированные на создание определенных струк-
тур, зависящих от некоторых входных данных, причем эти структуры
хорошо определены, а входные данные принадлежат конкретному клас-
су. Примером может служить макро file_head, предназначенное для
ввода блока определения файла.
Вторая группа макро предназначена для генерации структур, за-
висящих от информации, доступной программисту, или такой информа-
ции, которую программист считает несущественной и подлежащей иг-
норированию. Эти макросы часто должны уметь обрабатывать
множество классов аргументов и определять класс аргументов. В то
же время эти макросы могут поддерживать локальные данные или
счетчики, освобождая программиста от рутинной работы. Макросы
структурного управления, приводимые в оставшейся части данной
главы, являются первыми примерами второй группы. Конечно, макросы
этих двух групп обычно частично перекрываются.
Для одного типа макро программист использует эти средства для
того, чтобы избежать дополнительного ввода данных с клавиатуры
или какой-либо другой неблагодарной работы. Для другого типа
программист использует эти средства для создания структур высоко-
го уровня, основанных на способности ассемблера поддерживать про-
пущенную информацию. В целях упрощения своей работы программист
умышленно прячет детали реализации.
Примером макро высокого уровня является использование макро,
упрощающих применение мнемоник в ассемблере. Хотя большинство ко-
манд процессора 8086 может использоваться с регистровыми операн-
дами или операндами памяти, многие из них не позволяют непосредс-
твенных операндов. Примером является команда PUSH, хотя 186/188
- 1-22 -
и 286 позволяют проталкивать в стек непосредственные данные.
Довольно просто сконструировать макро pushi (проталкивание не-
посредственное), передающее нужный аргумент в регистр и проталки-
вающее этот регистр. Однако, если макро предназначено для реали-
зации более общей функции проталкивания, желательно, чтобы оно не
только проталкивало непосредственные данные, но и само решало,
является ли такая операция необходимой. Другими словами, програм-
мист хотел бы применять обобщенный pseudoopcode (псевдокод), ра-
ботающий во всех случаях.Реально псевдокод должен быть макро, вы-
числяющим операнды и генерирующим стандартный или расширенный
набор команд.
Первый шаг в написании такого общецелевого макро заключается в
определении операндов. Для решения этой задачи MASM имеет целый
набор специальных операторов.
Определение типов операндов
В среде 8086/8088 существует четыре основных типа операндов.
Это - регистровый операнд, непосредственный операнд, операнд па-
мяти и адреса. Для операндов, ориентированных на данные, возможны
подтипы. Регистры представляют собой специальные случаи суммато-
ров (регистр общего назначения A) и регистры сегментов. Все три
типа данных могут подразделяться на 8- и 16-битовые данные. Адре-
са могут быть near (близкие, состоящие только из смещения) или
far (далекие, состоящие из смещения и сегмента).
Как мы будем различать все эти типы? Мы будем использовать
операторы MASM .TYPE и TYPE. В Табл. 1-7 приведены результаты ис-
пользования этих операторов с различными классами операндов.
Таблица 1-7. Операторы MASM .TYPE и TYPE
Правила для .TYPE и TYPE
---------------------------------------------------------
Оператор Результат
---------------------------------------------------------
.TYPE биты 5 и 7 8х Определено внешне
2х Определено локально
0х Неверная ссылка
.TYPE биты 0 ... 2 х0 Абсолютный режим
х1 Программозависимый
х2 Зависимый по данным
TYPE с переменной 01 Переменная в байт
02 Переменная в слово
04 Переменная в двойное
слово
08 Переменная в четверное
слово
10 Переменная в 10 байтов
ХХ Структура размерностью
в ХХ
TYPE с программной меткой FFFF "Близкая" программная
метка
FFFE "Далекая" программная
метка
-------------------------------------------------------------
- 1-23 -
Примеры для .TYPE и TYPE
-------------------------------------------------------------
Тип переменной .TYPE Определено TYPE Определено
-------------------------------------------------------------