Макрокоманда – имя макроса, указываемое в коде программы на языке ассемблер и предназначенная для вызова соответствующего программный алгоритм действий с фактическими параметрами.
Макроопределение – это программный алгоритм действий макроса, описанный с использованием формальных параметров.
Макрорасширение – это тело макроопределения, сгенерированное компилятором со значениями фактических параметров и подставленное в сегмент кода вместо одноименной макрокоманды.
Макроопределение должно находиться до определения сегмента.
Директива macro указывает ассемблеру, что следующие команды до директивы endm являются частью макроопределения. Директива endm завершает макроопределение. Команды между директивами macro и endm составляют тело макроопределения.
Имена, на которые имеются ссылки в макроопределении должны быть определены где-нибудь в другом месте программы.
Описанная макрокоманда может использоваться в кодовом сегменте там, где необходимо. Когда ассемблер анализирует команду <имя_макроса>, он сначала просматривает таблицу мнемокодов и, не обнаружив там соответствующего элемента, проверяет макрокоманды. Так как программа содержит определение макрокоманды с нужным именем, по которому она вызывается в сегменте кода, ассемблер подставляет тело макроопределения, генерируя необходимые команды - макрорасширение.
Программа может использовать макрокоманду любое число раз, и каждый раз для таких макрокоманд ассемблер генерирует одинаковые макрорасширения.
Пример1:
init1 macro
assume cs:cseg,ds:dseg,ss:stack;es:dseg
push ds
sub ax,ax
push ax
mov ax,dseg
mov ds,ax
mov es,ax
endm
(слайд №11)
Использование параметров в макрокомандах.
|
В предыдущем макроопределении требовались фиксированные имена сегментов: cseg, dseg и stack. Для того, чтобы макрокоманда была более гибкой и могла принимать любые имена сегментов, определим эти имена, как формальные параметры:
Пример2:
init2 macro csname,dsname,ssname;Формальные параметры
assume cs:csname,ds:dsname,ss:ssname;es:dsname
push ds
sub ax,ax
push ax
mov ax,dsname
mov ds,ax
mov es,ax
endm
Формальные параметры (аргументы, указываемые при объявлении или определении макроса) в макроопределении указывают ассемблеру на соответствие их имен любым аналогичным именам в теле макроопределения. Все три формальных параметра csname, dsname и ssname встречаются в директиве assume, а параметр dsname еще и в последующей команде mov. Формальные параметры могут иметь любые правильные ассемблерные имена, не обязательно совпадающими именами в сегменте данных.
Теперь при использовании макрокоманды init2 необходимо указать в качестве параметров действительные имена трех сегментов в соответствующей последовательности (фактические параметры – это аргументы, передаваемый в макрос при его вызове).
(слайд №12)
Например, следующая макрокоманда содержит три параметра, которые соответствуют формальным параметрам в исходном макроопределении:
Макроопределение: init2 macro csname,dsname,ssname (форм. параметры)
| | |
Макрокоманда: init2 cseg, dseg, stack (параметры)
Так как ассемблер уже определил соответствие между формальными параметрами и операторами в макроопределении, то теперь ему остается подставить параметры макрокоманды в макрорасширении:
- Параметр 1: cseg ставится в соответствие с csname в макроопределении. Ассемблер подставляет cseg вместо csname в директиве assume.
- Параметр 2: dseg ставится в соответствие с dsname в макроопределении. Ассемблер подставляет dseg вместо двух dsname: в директиве assume и в команде mov.
- Параметр 3: stack ставится в соответствие с ssname в макроопределении. Ассемблер подставляет stack вместо ssname в директиве assume.
|
Ассемблер не распознает регистровые имена и имена, определенные в области данных, как таковые. В одной макрокоманде может быть определено любое число формальных параметров, разделенных запятыми, вплоть до 120 колонки в строке.
(слайд №13)
Комментарии.
Комментарии – это пояснения к исходному тексту программы, находящиеся непосредственно внутри комментируемого кода.
Для пояснений назначения макроопределения в нем могут находиться комментарии. Директива comment или символ «;» указывают на строку комментария.
Так как по умолчанию в листинг попадают только команды генерирующие объектный код, то ассемблер не будет автоматически выдавать и комментарии, имеющиеся в макроопределении. Если необходимо, чтобы в расширении появлялись комментарии, следует использовать перед макрокомандой директиву.lall ("list all" - выводить все), которая кодируется вместе с лидирующей
точкой:
.lall
<имя_макроса> [<формальные_параметры_макроса>]
Макроопределение может содержать несколько комментариев, причем некоторые из них могут выдаваться в листинге, а другие - нет. В первом случае необходимо использовать директиву.lall. Во втором – кодировать перед комментарием два символа точка с запятой (;;) - признак подавления вывода комментария в листинг. По умолчанию в ассемблере действует директива.xall, которая выводит в листинг только команды, генерирующие объектный код. И, наконец, можно запретить появление в листинге ассемблерного кода в макрорасширениях, особенно при использовании макрокоманды в одной программе несколько раз. Для этого служит директива.sall ("suppress all" - подавить весь вывод), которая уменьшает размер выводимого листинга, но не оказывает никакого влияния на размер объектного модуля.
|
Директивы управления листингом.lall,.xall,.sall сохраняют свое действие по всему тексту программы, пока другая директива листинга не изменит его. Эти директивы можно размещать в программе так, чтобы в одних макрокомандах распечатывались комментарии, в других - макрорасширения, а в третьих подавлялся вывод в листинг.
(слайд №14)