Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASM_lectures.doc
Скачиваний:
27
Добавлен:
28.04.2019
Размер:
992.77 Кб
Скачать

Макрокоманды.

Для каждой команды на ассемблере транслятор генерирует одну машинную инструкцию. Т.о. происходит трансляция «один в один». При трансляции программы на языке высокого уровня каждый оператор заменяется чаще всего не одной, а несколькими командами машинного языка. Т.о. можно сказать, что языки высокого уровня состоят из макрооператоров.

Ассемблер также имеет макро средства, но макроопределения или макрокоманды задаются программистом.

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

  • упростить и сократить исходный текст.

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

  • уменьшить число ошибок, т.е. увеличить скорость отладки.

Макроопределения.

Прежде, чем программист сможет использовать в тексте своей программы макрокоманду, он должен сначала её определить - такое задание макрокоманды называется макроопределением.

Формат макроопределения.

имя macro ;начало макроопределения

.

. ;тело макроопределения

. .

endm ;конец макроопределения

Директива macro указывает ассемблеру, что следующие команды до директивы endm являются макроопределением. Теперь при трансляции программы, когда ассемблер встретит имя программы, вместо него будут подсьавлены команды, составляющие тело макроса.

Например:

_print_ macro ;Вывод сообщения на экран

mov ah, 09h

lea dx, mes

int 21h

endm

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

В предыдущем примере макрокоманда всегда выводит на экран сообщение, находящееся в mes.

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

Например:

_print_ macro msg ;Вывод сообщения на экран

mov ah, 09h

lea dx, msg

int 21h

endm

Теперь при использовании директивы _print_ необходимо указать в качестве параметра действительный адрес сообщения, например:

_print_ msg1

_print_ msg2

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

Рассмотрим пример:

dos21 macro dosfunc

mov ah, dosfunc

int 21h

endm

Для использования данной макрокоманды при вводе с клавиатуры необходимо:

lea dx,namepar

dos21 0ah

Предполагается, что имеется другое макроопределение, использующее функцию 02 в регистре ah для ввода символа.

disp macro char

mov ah,02

mov dl,char

int 21h

endm

Можно изменить макроопределение disp, воспользовавшись макрокомандой dos21:

disp macro char

mov dl,char

dos21 02

endm

Для вывода ‘*’ достаточно просто написать:

disp ‘*’

Директива local

Если в теле макрокоманды определены метки, то при использовании такой макрокоманды в программе более одного раза - метки будут повторятся и ассемблер выдаст сообщение об ошибке.

Для обеспечения уникальности генерируемых в каждом макрорасширении имен используется директива LOCAL, которая должна быть непосредственно после macro.

Общий формат:

local метка1, метка2

Например:

prim_ macro

local compar,exit

...

compar: ...

...

exit: ...

и макрокоманда prim_ два раза встречается в контексте нашей программы:

...

prim_

...

prim_

В первом макрорасширении генерируются метки ??0000 и ??0001 соответственно для compar и exit. Во втором макрорасширении - метки ??0002 и ?0003 и т.д.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]