Макрокоманды
МЕТОДИЧЕСКИЕ УКАЗАНИЯ:
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: