|
4.
Условные директивы
Язык ассемблера включает в себя условные директивы
двух типов: директивы условного ассемблирования и директивы
условной генерации ошибок. Директива условного
ассемблирования обеспечивает ассемблирование блока
предложений лишь в том случае, если истинно заданное в
директиве условие. Директива условной генерации ошибки
проверяет заданное в ней условие и генерирует ошибку, т.е.
формирует сообщение в листинге программы и обеспечивает код
возврата, соответствующий наличию ошибки в исходном тексте,
если это условие истинно.
Директивы обоих типов проверяют условия времени
ассемблирования. Они не могут анализировать условия времени
выполнения, т.к. последние не могут быть вычислены до того,
как программа начнет выполняться. В условиях допустимы лишь
выражения, преобразуемые в константы при ассемблировании.
Директивы условного ассемблирования и директивы
условной генерации ошибок описаны в следующих двух разделах.
4.1. Директивы условного ассемблирования.
Директивы условного ассемблирования позволяют в
некоторой степени управлять процессом ассемблирования. В
зависимости от значений условий времени ассемблирования,
проверяемых этими директивами, макроассемблер может
пропустить обработку целого блока предложений или обработать
вместо него другой (альтернативный) блок.
Блок предложений условного ассемблирования имеет
следующий общий вид:
директива-условного-ассемблирования
..........
предложения ассемблера или инструкции
..........
[[ ELSE ]]
..........
предложения ассемблера или инструкции
..........
ENDIF
- 17 -
Директива-условного-ассемблирования задает условие,
при истинном значении которого будут ассемблироваться
предложения, расположенные непосредственно после директивы и
до ключевого слова ELSE, или, если оно опущено, до конца
блока, обозначаемого ENDIF. Если условие не выполняется,
ассемблируется группа предложений, расположенная между
ключевыми словами ESLE и ENDIF, а если ELSE опущено, MASM
пропускает блок.
Допускается вложенность директив. Максимальная глубина
вложения - 255.
В качестве директивы-условного-ассемблирования могут
задаваться конструкции, приведенные в таблице 4.1.
Таблица 4.1. Директивы условного ассемблирования.
____________________________________________
| |
| IF выражение |
|__________________________________________|
| |
| IFE выражение |
|__________________________________________|
| |
| IF1 |
|__________________________________________|
| |
| IF2 |
|__________________________________________|
| |
| IFDEF имя |
|__________________________________________|
| |
| IFNDEF имя |
|__________________________________________|
| |
| IFB <аргумент> |
|__________________________________________|
| |
| IFNB <аргумент> |
|__________________________________________|
| |
| IFIDN <аргумент-1>,<аргумент-2> |
|__________________________________________|
| |
| IFDIF <аргумент-2>,<аргумент-2> |
|__________________________________________|
В случае директивы IF блок ассемблируется, если
указанное выражение истинно (не нуль). Для директивы IFE
блок ассемблируется, если выражение ложно (нуль). Выражение
должно иметь абсолютное значение и не может содержать
ссылок вперед.
Директивы IF1 и IF2 проверяют номер прохода ассемблера
- 18 -
и обеспечивают обработку блока только на 1-м (IF1) или
только на 2-м (IF2) проходе.
Пример (выдача сообщений на консоль):
IF1
%OUT Pass 1
ELSE
%OUT Pass 2
ENDIF
Директивы IFDEF и IFNDEF проверяют, определено ли в
программе указанное имя. IFDEF обеспечивает ассемблирование,
если это имя определено как метка, переменная или символ,
IFNDEF - если имя не определено. Заметим, что если в
качестве имени задана ссылка вперед, она считается
неопределенной на 1-м проходе и определенной на 2-м.
Имена можно определять не только указанием их в
соответствующей позиции при мнемонике инструкции или
директивах определения памяти, но в опции ассемблера /D, что
позволяет управлять составом ассемблируемой программы без
изменения исходного файла.
Директивы IFB и IFNB проверяют значение указанного
аргумента, трактуемого как строка символов, и вызывают
ассемблирование блока, если аргумент является пробелом (IFB)
или отличен от пробела (IFNB). Аргумент может быть именем,
числом или выражением. Скобки < и > обязательны.
Директивы IFB и IFNB введены для использования их в
макроопределениях, где они могут управлять условным
ассемблированием, основываясь на том, задан или нет параметр
макроопределения. В этом случае в качестве аргумента следует
задавать один из формальных параметров макроопределения.
Директивы IFDIF и IFIDN сравнивают специфицированные
для них аргументы, которые трактуются как символьные строки
(с учетом регистра), и вызывают ассемблирование блока при их
идентичности (IFIDN) или неидентичности (IFDIF). Аргументы
могут быть именами, числами или выражениями. Скобки < и >
обязательны. Аргументы разделяются запятой.
Директивы IFDIF и IFIDN введены для использования их в
макроопределениях, где они могут управлять условным
ассемблированием, анализируя значения передаваемых в
макроопределение параметров. В этом случае в качестве
аргументов следует задавать формальные параметры
макроопределения.
4.2. Директивы условной генерации ошибок.
Использование директив условной генерации ошибок
позволяет контролировать ситуации, не нашедшие отражения в
- 19 -
синтаксисе языка ассемблера. Например, при помощи такой
директивы можно вызвать генерацию сообщения об ошибке и,
соответственно, установку минимального кода возврата
транслятора в случае использования регистра AX, что с точки
зрения синтаксиса не является ошибкой, но может быть
недопустимо по логике программы.
Обработка любой директивы условной генерации ошибок,
кроме .ERR1, с истинным условием эквивалентна распознаванию
фатальной ошибки (с кодом возврата 7), при которой MASM
уничтожает объектный файл.
Форматы директив и соответствующие им сообщения MASM
приведены в таблице 4.2.
Таблица 4.2. Директивы условной генерации ошибок.
____________________________________________________________
| | |
| Синтаксис | Номер и текст сообщения |
|___________________|______________________________________|
| | |
| .ERR1 | 87 Forced error - pass 1 |
|___________________|______________________________________|
| | |
| .ERR2 | 88 Forced error - pass 2 |
|___________________|______________________________________|
| | |
| .ERR | 89 Forced error |
|___________________|______________________________________|
| | |
| .ERRE выражение | 90 Forced error - expression equals 0|
|___________________|______________________________________|
| | |
| .ERRNZ выражение | 91 Forced error - expression not |
| | equals 0 |
|___________________|______________________________________|
| | |
| .ERRNDEF имя | 92 Forced error - symbol not defined |
|___________________|______________________________________|
| | |
| .ERRDEF имя | 93 Forced error - symbol defined |
|___________________|______________________________________|
| | |
| .ERRB <строка> | 94 Forced error - string blank |
|___________________|______________________________________|
| | |
| .ERRNB <строка> | 95 Forced error - string not blank |
|___________________|______________________________________|
| | |
| .ERRIDN <стро- | 96 Forced error - strings identical |
| ка-1>,<строка-2> | |
|___________________|______________________________________|
| | |
| .ERRDIF <стро- | 97 Forced error - strings different |
| ка-2>,<строка-2> | |
|___________________|______________________________________|
- 20 -
Директива .ERR обеспечивает безусловную генерацию
сообщения об ошибке. Директивы .ERR1 и .ERR2 также
безусловно воздействуют соответственно лишь на 1-й и 2-й
проход транслятора. Директива .ERR1 вызывает не фатальную
ошибку, а предупреждение.
Директивы .ERRNZ и .ERRE вычисляют значение указанного
выражения и обеспечивают появление сообщения об ошибке
соответственно в случае истинности (1) или ложности (0)
этого выражения.
Директива .ERRDEF обеспечивает появление фатальной
ошибки, когда указанное имя определено в программе как
метка, переменная или символ, а директива .ERRNDEF - когда
имя еще не определено. Если это имя является ссылкой вперед,
оно считается неопределенным на 1-м проходе и определенным
на 2-м. Эти директивы работают на 1-м проходе.
Директивы .ERRB и .ERRNB анализируют указанную строку
и обеспечивают генерацию сообщения об ошибке, если эта
строка соответственно содержит все пробелы или нет.
Директивы .ERRIDN и .ERRDIF вызывают появление
фатальной ошибки, если указанные строки соответственно
идентичны или различны.
© KOAP
Open Portal 2000
|