Макросы
Макросы - это те же процедуры, только виртуальные. Макросы подобны процедурам,
но они выполняются только во время компиляции. После компиляции все
макросы заменяются реальными командами. Если вы объявите макрос и никогда
не будете использовать его в вашем коде, компилятор просто проигнорирует его.
emu8086.inc содержит
хорошие примеры использования макросов. Этот файл содержит несколько
макросов, которые делают создание кода более легким.
Определение макроса:
имя MACRO [параметры,...]
<команды>
ENDM
|
В отличие от процедур, макрос должен быть определен перед
участком кода, где он будет использоваться, например:
MyMacro MACRO p1, p2, p3
MOV AX, p1
MOV BX, p2
MOV CX, p3
ENDM
ORG 100h
MyMacro 1, 2, 3
MyMacro 4, 5, DX
RET
|
Вышеописанный код эквивалентен следующему набору команд:
MOV AX, 00001h
MOV BX, 00002h
MOV CX, 00003h
MOV AX, 00004h
MOV BX, 00005h
MOV CX, DX
Некоторые важные замечания о макросах и процедурах:
- Если вы хотите использовать процедуру, вы должны применить команду
CALL, например:
CALL MyProc
-
Если вы хотите использовать макрос, вы можете просто напечатать его имя.
Пример:
MyMacro
-
Процедура располагается по определенному адресу в памяти. Если вы воспользуетесь
процедурой 100 раз, процессор будет передавать управление в эту часть
памяти. Возвращение из процедуры выполняется командой RET.
Для хранения адреса возврата используется стек. Команда
CALL занимает 3 байта, так что размер исполнимого файла
увеличивается очень незначительно, независимо от того, сколько
раз вызывается процедура.
-
Макрос выполняется непосредственно в коде программы. Поэтому если вы
используете один и тот же макрос 100 раз, то компилятор будет распаковывать
этот макрос также 100 раз, делая исполнимый файл все больше и больше,
каждый раз вставляя в программу команды макроса.
-
Вы должны использовать стек или регистры общего назначения
для передачи параметров процедуре.
-
Для передачи параметров макросу, вам достаточно просто напечатать их
после имени макроса. Например:
MyMacro 1, 2, 3
- Чтобы обозначить конец макроса, достаточно директивы ENDM.
- Чтобы обозначить конец процедуры, вы должны напечатать имя
процедуры перед директивой ENDP.
|
Макрос распаковывается непосредственно в коде, поэтому, если имеются
метки внутри макроопределения, вы можете получить ошибку "Duplicate declaration" (Двойное объявление),
если макрос используется два или более раз. Чтобы избежать такой проблемы,
используйте директиву
LOCAL, сопровождающую имена переменных,
меток или имен процедур. Например:
MyMacro2 MACRO
LOCAL label1, label2
CMP AX, 2
JE label1
CMP AX, 3
JE label2
label1:
INC AX
label2:
ADD AX, 2
ENDM
ORG 100h
MyMacro2
MyMacro2
RET
|
Если вы планируете использовать ваши макросы в нескольких программах,
то лучше разместить все макросы в отдельном файле. Поместите этот файл
в каталог
Inc и примените директиву
INCLUDE имя файла для использования макросов.
Пример такого файла можно найти в разделе
Библиотека общих функций - emu8086.inc.
<<< Предыдущая часть <<<
>>> Следующая часть >>>