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