 |
щий синтаксис:
%выражение
где "выражение" может быть либо выражением (использующим любые
допустимые операнды и операции), или именем текстовой макрокоман-
ды. Если это выражение, то создаваемым текстом будет результат
выражения с текущим основанием. Если "выражение" - это текстовая
макрокоманда, то создаваемым тестом будет текст, который предс-
тавляет текстовая макрокоманда. Например, следующий фрагмент
программы:
DEFSYM MACRO NUM
TMP_&NUM:
ENDNUM
TNAME EQU ; определение
; текстовой макрокоманды
DEFSYM %5+4
DEFSYM %TNAME
приведет с следующему макрорасширению:
TMP_9:
TMP_JUNK:
Переопределение общей макрокоманды, состоящей из нескольких строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Общие макрокоманды, состоящие из нескольких строк, вы можете
переопределять. Новое определение автоматически заменяет старое
определение. Все предшествующие места, где макрокоманда уже была
вызвана, не изменяются. Во всех вызовах макрокоманды, следующих
за переопределением, используется новое определение.
Удаление общей макрокоманды: директива PURGE
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для удаления макрокоманд вы можете использовать директиву
PURGE. Директива PURGE имеет следующий синтаксис:
PURGE имя_макрокоманды, [имя_макрокоманды]...
Директива PURGE удаляет определение макрокоманды, состоящей
из нескольких строк, с именем "имя_макрокоманды" После использо-
Турбо Ассемблер 3.0/tasm/#2-2 = 39 =
вания директивы PURGE Турбо Ассемблер больше не интерпретирует
идентификатор PURGE как макрокоманду, например:
ADD MACRO a1,a2
SUB a1,a2
ENDM
ADD ax,bx ; этот вызов даст SUB ax,bx
PURGE ADD
ADD ax,bx ; теперь это не макрокоманда, поэтому
; вы получите ADD ax,bx
Вы можете сразу удалить этой директивой несколько макроко-
манд, разделив их имена запятыми. Отметим однако, что идентифика-
тор удаленной макрокоманды можно переопределить только другой
макрокомандой.
Определение вложенных и рекурсивных макрокоманд
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Операторы в теле макрокоманды могут включать в себя операто-
ры, вызывающие или определяющие другие макрокоманды. Возьмем сле-
дующий пример:
MCREATE MACRO opname, op1,op2,op3,op4,op5,op6,op7
IFNB opname
DO & opname MACRO op,count
IF count LE 4
REPT count
opname op,1
ENDM
ELSE
MOVE CL,count
opname op,CL
ENDIF
EMDM ; конец DOopname
MCREATE op1,op2,op3,op4,op5,op6,op7 ; рекурсия!
ENDIF ; конец if
ENDM ; конец макрокоманды MCREATE
После вызова:
MCREATE ror,rol,rcl,rcr,shl,sal,sar
будут созданы дополнительные макрокоманды DOror, DOrol и т.д.,
которые можно использовать следующим образом:
DOshr ax,5
DOrcr bx,3
Рекурсивные макрокоманды можно вызывать со списком парамет-
ров и задавать их таким образом, что они будут работать с пере-
менным числом параметров (от 0 до максимального числа парамет-
ров). Для этого макрокоманда должна использовать первый параметр
Турбо Ассемблер 3.0/tasm/#2-2 = 40 =
для выполнения ее макрорасширения, а затем вызывать сама себя с
оставшимися параметрами. При каждой рекурсии остается на один
параметр меньше. В конце концов, будет последняя рекурсия без па-
раметров.
Когда вы вызываете макрокоманду рекурсивно, всегда требуется
как-то проверить конец рекурсии. Обычно при наличии передаваемого
параметра это делается в теле макрокоманды с помощью условного
оператора IFNB. Приведем простой пример рекурсивной макрокоманды:
PUSH MACRO r1,r2,r3,r4,r5,r6,r7,r8
IFNB r1
PUSH r1
PUSH r2,r3,r4,r5,r6,r7,r8
ENDIF
ENDM
Счетчик повторения макрокоманды
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для повторения тела макрокоманды заданное число раз вы може-
те использовать директиву повторения REPT. Для этого используется
следующий синтаксис:
REPT выражение
тело_макрокоманды
ENDM
где "выражение" указывает Турбо Ассемблеру, сколько раз нужно
повторить тело макрокоманды, заданное между директивами REPT и
ENDM. При вычислении "выражения" должна получаться константа. Оно
не должно содержать имен идентификаторов с опережающими ссылками.
Чтобы отметить конец блока повторения, используйте директиву
ENDM. Например, следующий код:
REPT 4
SHL ax,1
ENDM
даст в результате следующее:
SHL ax,1
SHL ax,1
SHL ax,1
SHL ax,1
Турбо Ассемблер 3.0/tasm/#2-2 = 41 =
Директива WHILE
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для повторения тела макрокоманды до того момента, пока опре-
деленное выражение не примет значения 0 (false), вы можете ис-
пользовать макродирективу WHILE. Она имеет следующий синтаксис:
WHILE выражение
тело_макрокоманды
ENDM
Перед каждой итерацией тела макрокоманды Турбо Ассемблер вы-
числяет "выражение". Будьте аккуратны и избегайте бесконечных
циклов, которые привести к тому, что Турбо Ассемблер исчерпает
доступную память или прекратит работу. Приведем пример использо-
вания директивы WHILE:
WHILE 1
;; ничего не делает
ENDM
Макрокоманды повторения строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для повторения тела макрокоманды для каждого элемента в
списке или каждого символа в строке вы можете использовать макро-
директивы повторения IRP и IRPC. Каждая из этих директив требует
от вас задания одного формального аргумента. Приведем синтаксис
директивы IRP:
IRP формальный_аргумент, список_аргументов
тело_макрокоманды
ENDM
Директива IRPC имеет следующий синтаксис:
IRP формальный_аргумент, строка
тело_макрокоманды
ENDM
в обоих случаях "формальный_аргумент" - это аргумент, используе-
мый в теле макрокоманды. Конец тела макрокоманды отмечает ENDM.
В синтаксисе директивы IRP "список_аргументов" состоит из
спискам аргументов, разделенных запятыми. Аргументами может быть
любой текст (идентификаторы, строки, числа и т.д.). Форма каждого
 |
|