Справочник по языку Ассемблера IBM PC



         

Макрокоманды - часть 6


/p>

где тип может принимать значения:

  • REQ, которое говорит о том, что требуется обязательное явное задание фактического аргумента при вызове макрокоманды;
  • =<любая_строка> — если аргумент при вызове макрокоманды не задан, то в соответствующие места в макрорасширении будет вставлено значение по умолчанию, соответствующее значению любая_строка.
    Будьте внимательны: символы, входящие в любая_строка, должны быть заключены в угловые скобки.

Но не всегда ассемблер может распознать в теле макроопределения формальный аргумент. Это, например, может произойти в случае, когда он является частью некоторого идентификатора. В этом случае последовательность символов формального аргумента отделяют от остального контекста с помощью специального символа &.
Этот прием часто используется для задания модифицируемых идентификаторов и кодов операций.
К примеру, определим макрос, который предназначен для генерации в программе некоторой таблицы, причем параметры этой таблицы можно задавать с помощью аргументов макрокоманды:

... def_table macro type=b,len=REQ tabl_&type d&type len dup (0) endm ... .data def_tabl b,10 def_tabl w,5

После того как вы подвергнете трансляции текст программы, содержащий эти строки, вы получите следующие макрорасширения:

tabl_b db 10 dup (0) tabl_w dw 10 dup (0)

Символ & можно применять и для распознавания формального аргумента в строке, заключенной в кавычки ' '. Например:

num_char macro message ;... ;подсчитать количество (num) символов в строке jmp m1 elem db 'Строка &message содержит ' ;число символов в строке message в коде ASCII num db 2 dup (0) db ' символов',10,13,'$' ;конец строки для вывода функцией 09h m1: ;... ;вывести elem на экран endm

В связи с рассмотрением последнего фрагмента разберем ситуацию, когда тело макроопределения содержит метку или имя в директиве резервирования и инициализации данных. Если в программе некоторая макрокоманда вызывается несколько раз, то в процессе макрогенерации возникнет ситуация, когда в программе один идентификатор будет определен несколько раз, что, естественно, будет распознано транслятором как ошибка. Для выхода из подобной ситуации применяют директиву local, которая имеет следующий синтаксис:

local список_идентификаторов

<


Содержание  Назад  Вперед