Пример макрокоманды 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 Макросимволы
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 Специальные символы в макрокомандах