Если в определении макроинструкции встречается её же имя, то используется предыдущее значение этого имени. Таким образом могут быть сделаны полезные переопределения макросинструкций, например:
macro mov op1,op2
{
if op1 in
& op2 in
push op2
pop op1
else
mov op1,op2
end if
}
Эта макроинструкция расширяет синтаксис инструкции «mov
mov ds,es» будет ассемблировано как «push es» и «pop ds». Во всех других случаях будет использована стандартная инструкция «mov». Синтаксис этого «mov» может быть расширен далее определением следующей макроинструкции с таким именем, который будет использовать предыдущий:macro mov op1,op2,op3
{
if op3 eq
mov op1,op2
else
mov op1,op2
mov op2,op3
end if
}
Это позволяет инструкции «mov
mov es,ds,dx» будет ассемблировано как «push ds», «pop es» и «mov ds,dx».Если требуется создать макроинструкцию с аргументом, который содержит запятые, этот аргумент следует заключить между «<
>». Если он содержит больше одного знака «<», то для окончания его описания должно быть использовано такое же количество «>».«purge
mov» вышеуказанными макроинструкциями вы можете отключить синтаксис с тремя операндами, используя директиву «purge mov». Следующее «purge mov» отключит синтаксис для сегментных регистров, а дальнейшее применение этой директивы не возымеет эффекта.Если после директивы «macro
macro stoschar [char]
{
mov al,char
stosb
}
Эта макроинструкция допускает неограниченное число аргументов, и каждый будет обработан этими двумя инструкциями отдельно. Например, «stoschar 1,2,3
mov al,1
stosb
mov al,2
stosb
mov al,3
stosb
Существуют некоторые специальные директивы, возможные только внутри определений макроинструкций. Директива «local
macro movstr
{
local move
move:
lodsb
stosb
test al,al
jnz move
}
Каждый раз, когда используется эта макроинструкция, «move
«forward
reverse» и «common» делят макроинструкцию на блоки, каждый из которых обрабатывается после окончания обработки предыдущего. Они различаются в поведении только если макроинструкция поддерживает много групп аргументов. Блок инструкций, следующий за «forward» будет обрабатываться для каждой группы аргументов от первой до последней, как блок по умолчанию (без этих директив). Блок, идущий за «reverse» будет обрабатываться для каждой группы аргументов в обратном порядке — от последней до первой. Блок за директивой «common» обрабатывается лишь один раз, просто для всех групп аргументов. Локальное имя, определенное в одном блоке, доступно во всех следующих блоках при обработке той же группы аргументов. Если оно было определено в блоке «common», оно доступно во всех следующих блоках, независимо от обрабатываемой группы.Вот пример макроинструкции, которая создает таблицу адресов строк и следующих за ними строк.
macro strtbl name,[string]
{
common
label name dword
forward
local label
dd label
forward
label db string,0
}