Условные директивы с текстовыми строками
Эти директивы условное ассемблирование или генерацию сообщений об ошибке на основе содержимого текстовой строки. Текстовой строкой может быть либо строка, заключенная в угловые скобки (<>), либо имя текстовой макрокоманды с предшествующим символом %. Например:
; текстовая строка ABC %foo ; содержимое текстовой макрокоманды foo
Примечание: Об определении текстовых макрокоманд и работе с ними рассказывается в этом разделе.
Директивы условного ассемблирования, использующие текстовую строку, показаны в следующей таблице:
Директивы условного ассемблирования, использующие текстовую строкуДиректива IFxxx | ассемблирует "тело_условия_true", если: |
---|
IFNB текст_строка | "текст_строка" не состоит из одних пробелов. | IFB текст_строка | "текст_строка" не пуста. | IFIDN текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" идентичны. | IFINDI текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" идентичны (регистр символов не учитывается. | IFDIF текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" различны. | IFDEFI текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" различны (регистр символов игнорируется. | ELSEIFNB текст_строка | "текст_строка" не состоит из пробелов. | ELSEIFB текст_строка | "текст_строка" не пуста. | ELSEIFIDN текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" идентичны (регистр символов игнорируется). | ELSEIDNI текст_строка_1,текст_строка_2 | "текст_строка_1" и "текст_строка_2" идентичны (регистр символов игнорируется). | ELSEIFDIF текст_строка_1,текст_строка_2 | "текст_строка_1" и "текст_строка_2" различны. | ELSEIFDIFI текст_строка_1,текст_строка_2 | "текст_строка_1" и "текст_строка_2" различны (регистр символов игнорируется). |
Использующие текстовую строку директивы генерации сообщения об ошибке показаны в следующей таблице:
Директивы вывода сообщений об ошибке использующие текстовую строкуДиректива ERRxxx | Генерирует сообщение об ошибке, если: |
---|
ERRIFNB текст_строка | "текст_строка" не состоит из одних пробелов. | .ERRIFNB текст_строка | "текст_строка" не состоит из одних пробелов (только для режима MASM). | ERRIFB текст_строка | "текст_строка" состоит из пробелов. | .ERRB текст_строка | "текст_строка" состоит из одних пробелов. | ERRIFIDN текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" идентичны. | .ERRIDN текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" идентичны (только для режима MASM). | ERRIFIDNI текст_строка_1,текст_строка_2 | "текст_строка_1" и "текст_строка_2" идентичны (регистр символов игнорируется). | .ERRIDNI текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" идентичны (регистр символов игнорируется) - только для режима MASM. | ERRIFDIF текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" различны. | .ERRDIF текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" различны (только для режима MASM). | ERIFDIFI текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" различны (регистр символов игнорируется). | .ERRFIFI текст_строка_1, текст_строка_2 | "текст_строка_1" и "текст_строка_2" различны (регистр символов игнорируется) - только для режима MASM. |
Используйте эти директивы для проверки передаваемых макрокомандам аргументов (однако их можно использовать не только в макрокомандах).
При использовании их в макроопределениях директивы IFB и IFNB позволяют определить, передали ли вы в макрокоманду нужное число аргументов. Если при вызове макрокоманды вы передали слишком мало аргументов, Турбо Ассемблер не генерирует сообщение об ошибке. Незаданные аргументы просто остаются пустыми. Таким образом, вы можете определить макрокоманду, воспринимающую переменное число аргументов. Например:
. . . load MACRO addr, reg IFNB MOV reg,addr ELSE MOV ax,addr ENDIF ENDM . . .
Вы можете вызывать макрокоманду данного примера, как load test,cx, что даст генерацию инструкции mov cx,test, или вызвать ее как load test, то приведет к генерации инструкции mov ax,test, поскольку второй параметр пуст. Можно также использовать директиву ERRIFB для генерации сообщения об ошибке, если в вызове макрокоманды пропущен аргумент:
. . . load MACRO addr ERRIFNB MOV reg,addr ENDM . . .
Если эту макрокоманду вызвать с помощью load, а не с помощью load test, то будет генерироваться ошибка.
Условия выполнения прохода Ассемблером
Следующие директивы обеспечивают выполнение условного ассемблирования или генерацию ошибки на основе текущего прохода Ассемблера:
Директива IFxxx | ассемблирует "тело_условия_true", если: |
---|
IF1 | Турбо Ассемблер выполняет первый проход. | IF2 | Турбо Ассемблер выполняет второй проход. |
Директива ERRxxx | генерирует ошибку user error, если: |
---|
ERRIF1 | Турбо Ассемблер выполняет первый проход. | .ERR1 | Турбо Ассемблер выполняет первый проход (только для режима MASM). | ERRIF2 | Турбо Ассемблер выполняет второй проход. | .ERR2 | Турбо Ассемблер выполняет второй проход (только для режима MASM). |
Обычно Турбо Ассемблер работает как однопроходный ассемблер. Если вы используете средство многопроходной работы Турбо Ассемблера (вызывая его с параметром командной строки /m), то при необходимости используется несколько проходов.
Поскольку Турбо Ассемблер всегда выполняет по крайней мере один проход, директива условного ассемблирования IF1 всегда будет ассемблировать код своего условного блока, а директивы .ERR1 и ERRIF1 всегда будут генерировать сообщение об ошибке (но только на первом проходе).
Если вы используете любую из этих директив и не разрешаете многопроходную работу, то Турбо Ассемблер будет генерировать для всех таких директив предупреждение "Pass dependent construction" ("Конструкция, зависящая от прохода"), чтобы предупредить вас о возможно опасном пропуске кода. Если вы разрешите многопроходную работу, Турбо Ассемблер будет выполнять точно два прохода и генерировать предупреждение Vaximum compatibility pass was done (Выполнен проход с целью обеспечения максимальной совместимости).
Включение условных директив в файл листинга
Обычно код условного ассемблирования с ложным условием (false) в листинг не включается. Используя директивы Турбо Ассемблера и параметры командной строки, вы можете это переопределить.
Примечание: Более подробная информация содержится здесь и в этом разделе. 1 2 3 4
8 8 8
| |