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

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

Макроопределение (макрос) – модуль программы с присвоенным именем, ассемблирующийся каждый раз, когда ассемблер встречает это имя в тексте программы. Любой макрос начинается директивой MACRO и заканчивается директивой ENDM.

Shablon1 MACRO

…

…

ENDM

Теперь в программе можно использовать слово Shablon1 вместо имени команды. Ассемблер же заменит каждое такое слово на то, что содержится внутри макроса.

Возникает вопрос насчет того, почему бы не использовать вместо макросов обычные процедуры и не вызывать их командой CALL? Преимущество процедуры в том, что если она вызывается несколько раз, то программа становится более компактной. Однако в случае использования макроса мы выиграем во времени выполнения из-за отсутствия лишних команд вызова и возврата CALL и RET.

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

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

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

Простейший вариант блока повторений – REPT. Завершается, как и обычный макрос, директивой ENDM. Естественно, как и классическая форма макросов, блоки повторений могут вызываться с параметрами. Для этого используют директивы IRP и IRPC.

Блок, описанный директивой IRP, будет вызываться столько раз, сколько значений указано в списке (в угловых скобках), и при каждом повторении будет определена метка с именем параметр, равная очередному значению из списка.

IRP параметр, <значение1,значение2...>

...

ENDM

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

IRPC параметр, строка

...

ENDM

Чуть выше мы упомянули угловые скобки, являющиеся один из макрооператоров. Следовательно, необходимо разобраться, что они из себя представляют. Итак, макроператоры – специальные операторы, работающие исключительно внутри макроопределений (напоминаем, что блоки повторений – всего лишь разновидность макросов). Рассмотрим наиболее важные из них.

Макрооператор & нужен для того, чтобы операнд «параметр», переданный макроопределению или блоку повторений, заменялся значением до обработки строки ассемблером. Ставятся два макрооператора – в начале и конце «параметра». Бывают ситуации, когда достаточно использовать только один амперсанд – в начале операнда «параметр», если не возникает неоднозначностей.

Макрооператор <> действует так, что весь текст, заключенный в эти скобки, рассматривается как текстовая строка, даже если он содержит пробелы или другие разделители. Обычно используется при передаче текстовых строк в качестве параметров для макросов, а также при передаче списка параметров вложенному макроопределению или блоку повторений.

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

Макрооператор % указывает, что находящийся за ним текст является выражением и должен быть вычислен. Обычно это требуется для того, чтобы передавать в качестве параметра в макрос не само выражение, а его результат.