Аргументы макрокоманд

    В обработке макрокоманд применяется одно из ценных свойств

    процедур: в генерацию макрокоманды можно вносить изменения с

    помощью параметров. Точно так же, как параметры подпрограммы могут

    влиять на ее выполнение, параметры макрокоманды определяют

    фактически генерируемые команды. И так же, как и процедуры,

    макрокоманды без параметров встречаются относительно редко.

 

      Рассмотрим еще один простой пример. Мы составили программу так,

    что во многих ее местах содержимое определенной ячейки памяти

    складывается с различными константами. Вместо того, чтобы много раз

    писать команду

 

      ADD MEMORY_BYTE,5

      или

      ADD MEMORY_BYTE,7

 

 

    нам хотелось бы воспользоваться для нее соответствующей

    макрокомандой. Однако во всех приведенных командах константы

    разные. Поэтому мы сделаем константу параметром макрокоманды. На

    Фиг. 6.2 показаны определение и применение макрокоманды ADDBYTE. В

    этом примере в качестве параметра в определении макрокоманды

    используется символическое имя CONSTANT. Любые символичесике имена,

    появляющиеся в поле операнда оператора MACRO, интерпретируются как

    параметры. В момент определения макрокоманды у имени CONSTANT нет

    никакого значения: оно просто резервирует место в тексте

    макрокоманды. Позднее, при вызове и обработке текста макрокоманды,

    вместо символического имени в определении макрокоманды

    подставляется определенное значение параметра.

      Важно отметить, что параметр макрокоманды - это текстовый

    параметр. Так как макропроцессор фактически является текстовым

    процессорорм, то он не отличает цифры от букв и наоборот. Это

    позволяет при вызове макрокоманды использовать вместо чисел

    символические имена. Любой смысл приписывается символьной строке не

    макропроцессором, а ассемблером. Макропроцессор подставляет

            Microsoft (R) Macro Assembler Version 5.00              1/1/80 04:02:43

            Фиг. 6.2 Макрокоманда с аргументом                Page         1-1

 

 

                                          PAGE    ,132

                                          TITLE   Фиг. 6.2 Макрокоманда с аргументом

 

                                    ADDBYTE MACRO   CONSTANT

                                          ADD     MEMORY_BYTE, CONSTANT

                                          ENDM

 

             0000                   CODE    SEGMENT

                                          ASSUME  CS:CODE

 

             0000  ??               MEMORY_BYTE     DB      ?

 

             = 0004                       FOUR        EQU     4         ; Симвользое изображение константы

 

                                          ADDBYTE           2

             0001  2E: 80 06 0000 R 02   1            ADD     MEMORY_BYTE, 2

                                          ADDBYTE           4

             0007  2E: 80 06 0000 R 04   1            ADD     MEMORY_BYTE, 4

                                          ADDBYTE           FOUR

             000D  2E: 80 06 0000 R 04   1            ADD     MEMORY_BYTE, FOUR

 

             0013                   CODE    ENDS

                                          END

 

            Фиг. 6.2 Аргументы макрокоманды

 

    текстовую строку из вызова макрокоманды на место символического

    имени в определении макрокоманды. Таким образом программа может

    использовать константное значение "FOUR" с тем же успехом, что и

    константу "4".

 

      Возможность использовать символические имена в качестве

    параметров макрокоманд принципиально важна для следующего примера

    макрокоманды. Этой макрокоманда, одной из команд сопроцессора 8087,

    требуется параметр, который при обычном ее использовании почти

    всегда бывает символическим именем. Макрокоманда FLDCW - это

    команда сопроцессора 8087, которая задает ячейку памяти. Так как в

    программах на языке ассемблера в большинстве случаев обращаются к

    ячейкам памяти с помощью символических имен, то желательно

    сохранить этот способ и для программирования сопроцессора 8087.

 

      На Фиг.6.3 приводится макрокоманда FLDCW и несколько обрашений

    к ней. Заметьте, что макрокоманда FLDCW использует в качестве

    параметра символическое имя "SOURCE". Параметр SOURCE является

    адресом, с которого сопроцессор 8087 загружает управляющее слово.

    Для генерации требуемого машинного кода макрокоманда FLDCW

    использует команду 8088 ESC. Однако для того, чтобы определить байт

    mod=r/m команды, команде ESC требуется значение адреса. Как раз для

             Microsoft (R) Macro Assembler Version 5.00              1/1/80 04:02:47

             Фиг. 6.3 Макрокоманда для команды FLDCW                 Page     1-1

 

 

                                           PAGE    ,132

                                           TITLE   Фиг. 6.3 Макрокоманда для команды FLDCW

 

                                     FLDCW   MACRO   SOURCE

                                           DB      09BH

                                           ESC     0DH, SOURCE

                                           ENDM

 

            0000                     CODE    SEGMENT

                                           ASSUME  CS:CODE

 

            0000  ????               MEMORY_LOCATION DW      ?

 

                                           FLDCW   MEMORY_LOCATION

            0002  9B              1        DB      09BH

            0003  2E: D9 2E 0000 R      1        ESC     0DH, MEMORY_LOCATION

                                           FLDCW   ES:[DI]

            0008  9B              1        DB      09BH

            0009  26: D9 2D       1        ESC     0DH, ES:[DI]

                                           FLDCW   MEMORY_LOCATION[BX+SI]

            000C  9B              1        DB      09BH

            000D  2E: D9 A8 0000 R      1        ESC     0DH, MEMORY_LOCATION[BX+SI]

 

            0012                     CODE    ENDS

                                           END

 

            Фиг. 6.3. Макрокомнда FLDCW

 

    этого макрокоманда и использует параметр SOURCE. Такая организация

    макрокоманды FLDCW позволяет программировать весьма естественным

    способом. Точно так же как пишется

 

      INC MEMORY_LOCATION

 

    вы можно написать команду для сопроцессора 8087

 

      FLDCW MEMORY_LOCATION

 

      Это справедливыо не только для адресов, заданных символическими

    именами, но и для других способов адресации. На Фиг. 6.3 показано

    несколько примеров задания операнда с помощью адресации по базе и

    индексу. Так как макропроцессор воспринимает параметр как какой-то

    фрагмент текста, то параметр может быть образован любой символьной

    строкой, какую вы пожелаете.

 

      Можно задать макрокоманду и с несколькими параметрами.

    Единственное, что ограничивает число параметров макрокоманды, это

    длина ассемблерной строки. Все, что следует за оператором MACRO

    интерпретируется макропроцессором как параметр. Для разделения

    символических имен в определении макрокоманды пользуются запятыми.

    Оператор MACRO с тремя параметрами будет выглядеть следующим

    образом:

 

      EXAMPLE MACRO ARG1, ARG2, ARG3

 

    Аналогично, при вызове макрокоманды вы должны задать значение

    каждого из параметров. Если вы хотите пропустить какой-то параметр,

    то ассемблер подставит вместо него символьную строку нулевой длины.

    Иногда это полезно, но часто приводит к неправильной трансляции.

    Если макрокоманда имеет более одного параметра, то при вызове

    макрокоманды относящийся к параметрам текст разделяется запятыми.

    Это в точности совпадает со способом задания нескольких параметров

    к любой из команд микропроцессора 8088, поэтому будет вполне

    естественным для вас. Вызов макрокоманды с тремя параметрами может

    выглядеть так:

 

           EXAMPLE 5, [BX], MEMORY_BYTE

 

    В следующем примере вы увидите некоторые возможности множествен-

    ности параметров.

Hosted by uCoz