Assembler для начинающих


Макрооператоры



Макрооператоры


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




Содержание раздела