На главную Назад
Добро пожаловать, уважаемый посетитель!

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


 

Mail.ru