Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 138

Unknown Author

V I

или если параметр надо указать внутри строки, то следует использовать макрооператор & (см. D&TP в макросе VAR). В теле макроса можно использовать комментарии, начинающиеся с двух точек с запятой.

Завершает макроопределение директива ENDM (end of macro). Обратите особое внимание на то, что в этой директиве не надо повторять имя макроса (если здесь указать имя макроса, то это предложение будет рассматриваться как рекурсивный вызов макроса). Отметим также, что именно эта директива указывается и в конце блоков повторения (в ЯА эти блоки рассматриваются как специфический случай макросов).

Где размещать макроопределения? Они могут быть размещены в любом месте текста программы (по ним в машинную программу ничего не записывается), но обязательно до первой ссылки на этот макрос. Таким образом, в Я А действует правило: сначала опиши макрос и только затем обращайся к нему.

11.3.2. Макрокоманды

В тех местах программы, где мы хотим, чтобы макрогенератор подставил макрос, необходимо выписать обращения к макросу в виде макрокоманды, которая записывается следующим образом: <имя макроса> фактические параметры через запятую и/или пробел>

Конкретные примеры:

SUM A,ES:B    или    SUM A ES:B

VAR Z,W,?    или    VAR Z W,?

Как видно, макрокоманды очень похожи на обычные команды и директивы. Но есть и отличия. Во-первых, вместо названия команды или директивы, являющегося служебным словом, в макрокоманде указывается имя макроса, которое придумал сам автор программы. Во-вторых, в макрокоманде параметры могут отделяться друг от друга как запятыми, так и пробелами.

В качестве фактического параметра может быть указан любой текст (в том числе и пустой), но он должен быть сбалансирован по кавычкам и угловым скобкам и в нем не должно быть запятых, пробелов и точек с запятой вне этих кавычек и скобок. Поскольку запятыми и пробелами отделяется один параметр от другого, а с точки с запятой начинается комментарий, то их использование внутри фактического параметра привело бы к путанице.

При записи параметров макрокоманд можно использовать те же макрооператоры о, ! и %, что и при записи фактических параметров блоков повторения. Например, если в фактическом параметре надо указать запятую, пробел или точку с запятой, то параметр следует заключить в уголки:

SUM <WORD PTR [SI]>,А VAR C W <1,2>

При этом, напомним, уголки не считаются относящимися в параметру, а лишь указывают его границы.

Число фактических параметров, указываемых в макрокоманде, вообще говоря, должно равняться числу формальных параметров макроса, причем i-й фактический параметр соответствует i-му формальному параметру. Однако, если фактических параметров указано больше, чем надо, то лишние фактические параметры игнорируются, а если меньше, то считается, что в качестве недостающих фактических параметров заданы пустые тексты,

1133. Макроподстановки и макрорасширения

Теперь рассмотрим, что происходит с макрокомандами. Когда макрогенератор, просматривая исходный текст программы, встречает макрокоманду, то он выполняет макроподстановку: находит описание макроса с указанным именем, берет его тело, заменяет в этом теле все формальные параметры на соответствующие фактические параметры и полученный таким образом текст (он называется макрорасширением) подставляет в программу вместо макрокоманды.