; Сохранение в стеке регистров, перечисленных в списке гeg | ||
PushReg | macro reg | ; заголовок макроопределения |
irp r,<reg> | ; начало оператора повторения | |
push r | заготовка повторяемой команды | |
endm | конец оператора повторения | |
endm | конец макроопределения | |
BO( | :становление из | стека регистров, перечисленных в списке reg. |
PopReg | macro reg | заголовок макроопределения |
irp r,<reg> | оператор повторения | |
pop r | заготовка повторяемой команды | |
endm | конец оператора повторения | |
endni | конец макроопределения | |
Макросы примера 2.12 различаются только заготовкой повторяемой команды. В одном случае это запись в стек, а в другом — выталкивание из него.
При оформлении макросов используются специальные директивы. Текст любого макроопределения начинается директивой macro, перед ней указывается имя макроса, а после нее, в той же строке, список аргументов, если таковые имеются, в данном примере это reg.
Другая, часто используемая директива — endm. В зависимости от контекста она указывает конец макроопределения или оператора, что и показано в примере 2.12.
Тела макроопределений примера 2.12 состоят из директивы повторения irp. После нее, в той же строке, указываются параметр г и имя списка аргументов, заключенное в угловые скобки. Оно должно совпадать с именем, указанным в директиве macro. В следующей строке записывается повторяемая команда, один из операндов которой г соответствует параметру директивы irp.
В общем случае тело директивы irp может состоять из нескольких команд или содержать другие директивы, поэтому нужен признак конца директивы endm.
Обнаружив в тексте программы макроопределение, Макроассемблер проверяет его синтаксис и запоминает имя и текст, не включая его в тело задачи. Исполнение макроопределения (вставка команд в тело задачи) будет производиться при каждом макровызове.