Директива WHILE
Для повторения тела макрокоманды до того момента, пока определенное выражение не примет значения 0 (false), вы можете использовать макродирективу WHILE. Она имеет следующий синтаксис:
WHILE выражение тело_макрокоманды ENDM
Перед каждой итерацией тела макрокоманды Турбо Ассемблер вычисляет "выражение". Будьте аккуратны и избегайте бесконечных циклов, которые привести к тому, что Турбо Ассемблер исчерпает доступную память или прекратит работу. Приведем пример использования директивы WHILE:
WHILE 1 ;; ничего не делает ENDM
Макрокоманды повторения строк
Для повторения тела макрокоманды для каждого элемента в списке или каждого символа в строке вы можете использовать макродирективы повторения IRP и IRPC. Каждая из этих директив требует от вас задания одного формального аргумента. Приведем синтаксис директивы IRP:
IRP формальный_аргумент, список_аргументов тело_макрокоманды ENDM
Директива IRPC имеет следующий синтаксис:
IRP формальный_аргумент, строка тело_макрокоманды ENDM
в обоих случаях "формальный_аргумент" - это аргумент, используемый в теле макрокоманды. Конец тела макрокоманды отмечает ENDM.
В синтаксисе директивы IRP "список_аргументов" состоит из спискам аргументов, разделенных запятыми. Аргументами может быть любой текст (идентификаторы, строки, числа и т.д.). Форма каждого аргумента в списке аналогична той, которая описана выше для вызова общей макрокоманды, состоящей из нескольких строк. Список аргументов всегда нужно заключать в угловые скобки (<>).
В синтаксисе директива IRPC аргумент состоит из одной строки. Строка может содержать столько символов, сколько вы хотите.
Для каждого аргумента или символа в строке Турбо Ассемблер будет включать в модуль тело макрокоманды, подставляя вместо формального аргумента аргумент или символ (когда он его находит). Например:
IRP reg PUSH reg ENDM
дает следующее:
PUSH ax PUSH bx PUSH cx PUSH dx
а директива IRPC:
IRPC LUCKY,1379 DB LUCKY ENDM
дает следующее:
DB 1 DB 2 DB 3 DB 4
Используйте директива IRPC аккуратно, поскольку Турбо Ассемблер помещает каждый символ в строке в макрорасширение "как есть", поэтому макрокоманда строкового повторения:
IRPC CHAR,HELLO DB CHAR ENDM
может дать не DB "H","E"","L","L","O", а DB H,E,L,L,O (где каждая буква интерпретируется как имя идентификатора.
Непосредственная макродиректива %
Непосредственная макродиректива % интерпретирует строку текста так, как если бы это было тело макрокоманды. Приведем ее синтаксис:
# строка_тела_макрокоманды
где "строка_тела_макрокоманды" представляет тело макрокоманды, используемое для непосредственного макрорасширения, например:
SEGSIZE EQU LANGUAGE EQU % MODEL SEGSIZE,LANGUAGE ; дает MODEL TINY,WINDOWS PASCAL
Включение расширения макрокоманды в файл листинга
Расширения макрокоманд, состоящих из нескольких строк, обычно включаются в файл листинга. Однако в Турбо Ассемблере предусмотрены следующей директивы:
.LALL
.SALL
.XALL
%MACS
%NOMACS
которые позволяют управлять листингом макрорасширений.
Примечание: Подробнее об этих директивах рассказывается в этом разделе.
1 2 3 4 5 6
8 8 8
|