Пример макрокоманды IRPC на Фиг. 6.7 иллюстрирует, в частности,
применение символа "&". Это - оператор макрокоманд, который служит
для соединения двух элементов. В данном примере оператор "&"
соединяет параметр CHAR со строкой-константой "X". Как вы видите,
при этом формируется действительное имя регистра.
Еще одним удобным средством при программировании макрокоманд
является оператор LOCAL. Оператор LOCAL задает метку, которая
используется только в данной макрокоманде. Эта метка должна быть
уникальной для каждого вызова данной макрокоманды. Предположим, что
вы хотите написать макрокоманду, в которой должен быть кусок
программы следующего вида:
AAAAA: ADD AL,[BX]
INC BX
LOOP AAAAA
При первом вызове этой макрокоманды никаких сложностей не
Microsoft (R) Macro Assembler Version 5.00 4/2/89 16:06:59
Фиг. 6.8 Использование команды LOCAL Page 1-1
PAGE ,132
TITLE Фиг. 6.8 Использование команды LOCAL
PAUSE MACRO TIME
LOCAL LABEL
MOV CX,TIME
LABEL: LOOP LABEL
ENDM
0000 CODE SEGMENT
ASSUME CS:CODE
PAUSE 100
0000 B9 0064 1 MOV CX,100
0003 E2 FE 1 ??0000: LOOP ??0000
PAUSE 1000
0005 B9 03E8 1 MOV CX,1000
0008 E2 FE 1 ??0001: LOOP ??0001
000A CODE ENDS
END
Фиг. 6.8 Использование команды LOCAL
возникает. Однако при ее повторном использовании в той же
программе, метка AAAAA появляется второй раз. Ассемблер не может
допустить двух меток с одним и тем же именем в одной программе и
отмечает это как ошибку.
Проблема будет разрешена, если объявить метку AAAAA локальной
(LOCAL) для данной макрокоманды. Тогда ассемблер установит сформи-
рованное им уникальное имя для каждого случая применения метки
AAAAA. Встретив имя типа LOCAL впервые, ассемблер меняет его на имя
"??0000". Во второй раз - на имя "??0001" и т.д. Каждое имя в
транслируемой программе будет уникальным, поэтому никаких ошибок не
возникнет. На Фиг. 6.8 показано использование оператора LOCAL.
Здесь макрокоманда PAUSE устанавливает счетчик цикла и затем орга-
низует цикл с помощью метки, объявленной LOCAL. Данная макрокоманда
позволяет организовывать в выполнении программы паузу переменной
длительности. Если в макрокоманде необходимо использовать описатель
LOCAL, то он должен быть первым оператором макрокоманды, сразу же
следуя за оператором MACRO.
Символ Значение
---------------------------------------------------------------
;; Комментарий, имспользуемый только в макроопределении
& Соединение текста с параметром
! Вводить следующий символ без интерпретации
% Преобразовать следующее выражение в значение
---------------------------------------------------------------
Фиг. 6.9 Макросимволы
Существуют специальные символы, которые помогут вам управлять
макрокомандами и их параметрами. В таблице на Фиг. 6.9 показаны
четыре таких символов с объяснением их значений.
На Фиг.6.10 приведен ассемблерный листинг программы, в которой
эти символы применяются. Мы уже видели символ ";;" в некоторых
макрокомандах сопроцессора 8087. Этот специальный указатель поля
комментариев указывает макропроцессору на необходимость исключить
поле комментариев при расширении данной макрокоманды. Это позволит
включать в макрокоманду комментарии, не допуская их появления при
каждом расширении данной макрокоманды. Применение символа "&" мы
также встречали в программе на Фиг. 6.7.
Символ "!" позволяет вам в качестве следующего за ним знака
поставить любой символ. Это понадобится, если вы захотите включить
в макрокоманду какой-либо специальный символ, например, "%", чтобы
он не вызывал при этом никакой макрооперации. И наконец, оператор
"%" преобразует символическое имя в числовое значение, которое это-
му имени в данный момент соответствует. Вы можете воспользоваться
этой возможностью для ведения нумерации при генерации макрокоманды.
В нашем примере на Фиг. 6.10 макрокоманда нумерует выводимые
сообщения в соответствии со значением символического имени VALUE.
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:03:15
Фиг. 6.10 Специальные символы в макрокомандах Page 1-1
PAGE ,132
TITLE Фиг. 6.10 Специальные символы в макрокомандах
= 0000 VALUE EQU 0
EXAMPLE MACRO PARAMETER
DB 'MSG&PARAMETER' ;; Комментарий появится только в определении
INC AX
ENDM
0000 CODE SEGMENT
ASSUME CS:CODE
EXAMPLE %VALUE
0000 4D 53 47 30 1 DB 'MSG0' ;
0004 40 1 INC AX
0005 CODE ENDS
END
Фиг. 6.10 Специальные символы в макрокомандах