МАКРОКОМАНДЫ

 

МЕТОДИЧЕСКИЕ УКАЗАНИЯ:

1. Для выполнения лабораторной работы вы должны войти в каталог группы из панели NORTON. Каждый студент должен иметь в каталоге группы свой личный каталог. Все программы должны создаваться и записываться в личном каталоге студента.

2. Для создания макрокоманды (макроса) задаются имя макроса, директива MACRO, различные ассемблерные команды, которые должен генерировать данный макрос, и для завершения макроопределения - директива ENDM. Затем в любом месте программы, где необходимо выполнение определенных в макрокоманде команд, достаточно закодировать имя макроса. В результате ассемблер сгенерирует необходимые команды.

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

- упростить и сократить исходный текст программы;

- сделать программу более понятной;

- уменьшить число возможных ошибок кодирования;

 

Примерами макрокоманд могут быть операции ввода-вывода, связанные с инициализацией регистров и выполнением прерываний, преобразование ASCII двоичного форматов данных, арифметические операции над длинными полями, обработка строковых данных, деление с помощью вычитания.

3. Макроопределение должно находиться до определения сегмента. Рассмотрим пример простого макроопределения по имени INIT1, которое инициализирует сегментные регистры для ЕХЕ-программы:

 

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 ;Конец

 

Директива MACRO указывает ассемблеру, что следующие команды до директивы ENDM являются частью макроопределения. Имя макрокоманды - INIT1, хотя здесь возможны другие правильные уникальные ассемблерные имена. Директива ENDM завершает макроопределение. Семь команд между директивами MACRO и ENDM составляют тело макроопределения.

Имена, на которые имеются ссылки в макроопределении - CSEG, DSEG и STACK - должны быть определены где-нибудь в другом месте программы. Макрокоманда INIT1 может использоваться в кодовом сегменте там, где необходимо инициализировать регистры.

4. Для того, чтобы макрокоманда была более гибкой и могла принимать любые имена сегментов можно определить эти имена как формальные параметры:

 

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 необходимо указать в качестве параметров действительные имена трех сегментов в соответствующей последовательности. Например, следующая макрокоманда содержит три параметра, которые соответствуют формальным параметрам в исходном макроопределении:

 

Макроопределение: INIT2 MACRO CSNAME,DSNAME,SSNAME (форм. парам.)

 

Макрокоманда: INIT2 CSEG,DSEG,STAK (параметры)

 

Так как ассемблер уже определил соответствие между формальными параметрами и операторами в макроопределении, то теперь ему остается подставить параметры макрокоманды в макрорасширении:

 

- Параметр 1: CSEG ставится в соответствие с CSNAME в макроопределении. Ассемблер подставляет CSEG вместо CSNAME в директиве ASSUME.

- Параметр 2: DSEG ставится в соответствие с DSNAME в макроопределении. Ассемблер подставляет DSEG вместо двух DSNAME: в директиве ASSUME и в команде MOV.

- Параметр 3: STAC ставится в соответствие с SSNAME в макроопределении. Ассемблер подставляет STAC вместо SSNAME в директиве ASSUME.

5. Для пояснения назначения макроопределения в нем могут находится комментарии. Cимвол точка с запятой указывает на строку комментария, как показано в следующем макроопределении PROMPT: