|
Пример макрокоманды IRPC на Фиг. 6.7
иллюстрирует, в частности,
применение символа "&". Это
- оператор макрокоманд, который служит
для соединения двух элементов. В данном
примере оператор "&"
соединяет параметр CHAR со
строкой-константой "X". Как вы видите,
при этом формируется действительное имя
регистра.
Еще одним удобным средством при
программировании макрокоманд
является оператор LOCAL. Оператор LOCAL
задает метку, которая
используется только в данной макрокоманде.
Эта метка должна быть
уникальной для каждого вызова данной
макрокоманды. Предположим, что
вы хотите написать макрокоманду, в которой
должен быть кусок
программы следующего вида:
AAAAA:ADDAL,[BX]
INCBX
LOOPAAAAA
При первом вызове этой макрокоманды
никаких сложностей не
Microsoft (R) Macro Assembler Version
5.004/2/89 16:06:59
Фиг. 6.8 Использование команды LOCALPage1-1
PAGE,132
TITLEФиг. 6.8 Использование команды LOCAL
PAUSEMACROTIME
LOCALLABEL
MOVCX,TIME
LABEL:LOOPLABEL
ENDM
0000CODESEGMENT
ASSUMECS:CODE
PAUSE100
0000B9 00641MOVCX,100
0003E2 FE1??0000: LOOP??0000
PAUSE1000
0005B9 03E81MOVCX,1000
0008E2 FE1??0001: LOOP??0001
000ACODEENDS
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.001/1/80 04:03:15
Фиг. 6.10 Специальные символы в макрокомандахPage1-1
PAGE,132
TITLEФиг. 6.10 Специальные символы в макрокомандах
= 0000VALUEEQU0
EXAMPLE MACROPARAMETER
DB'MSG&PARAMETER' ;; Комментарий появится только в определении
INCAX
ENDM
0000CODESEGMENT
ASSUMECS:CODE
EXAMPLE %VALUE
00004D 53 47 301DB'MSG0' ;
0004401INCAX
0005CODEENDS
END
Фиг. 6.10 Специальные символы в макрокомандах
|