- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •1. Арифметические команды
- •2. Логические команды
- •3. Сдвиговые команды
- •4. Команды передачи управления и управления флагами
- •5. Формат строк ассемблера. Метки и их использование
- •6. Директивы распределения памяти
- •7. Сегменты
- •8. Прерывания
- •9. Директивы порядка загрузки сегментов
- •10. Директивы управления программным счетчиком
- •11. Условия
- •12. Процедуры
- •13. Глобальные объявления
- •14. Макроопределения
- •15. Выражения
- •16. Директивы управления файлами
- •17. Резидентные программы
- •Библиографический список
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •400005, Волгоград, просп. Ленина, 28, корп.1
- •400005, Волгоград, ул. Советская, 35, корп.7
14. Макроопределения
Макроопределение (макрос) – модуль программы с присвоенным именем, ассемблирующийся каждый раз, когда ассемблер встречает это имя в тексте программы. Любой макрос начинается директивой MACRO и заканчивается директивой ENDM.
Shablon1 MACRO
…
…
ENDM
Теперь в программе можно использовать слово Shablon1 вместо имени команды. Ассемблер же заменит каждое такое слово на то, что содержится внутри макроса.
Возникает вопрос насчет того, почему бы не использовать вместо макросов обычные процедуры и не вызывать их командой CALL? Преимущество процедуры в том, что если она вызывается несколько раз, то программа становится более компактной. Однако в случае использования макроса мы выиграем во времени выполнения из-за отсутствия лишних команд вызова и возврата CALL и RET.
Другое преимущество макросов – возможность их вызова с использованием параметров, в то время как процедуры этого не позволяют. Возможность добавления параметров дает нашим программам дополнительную гибкость, поскольку включаемый макросами код в зависимости от ситуации будет немного различаться:
Кроме того, не стоит забывать, что внутри макросов можем использовать директивы условного ассемблирования.
Если же мы хотим усложнить используемые нами макросы, добившись выполнения определенного участка кода заданное число раз, то используем блоки повторений.
Простейший вариант блока повторений – REPT. Завершается, как и обычный макрос, директивой ENDM. Естественно, как и классическая форма макросов, блоки повторений могут вызываться с параметрами. Для этого используют директивы IRP и IRPC.
Блок, описанный директивой IRP, будет вызываться столько раз, сколько значений указано в списке (в угловых скобках), и при каждом повторении будет определена метка с именем параметр, равная очередному значению из списка.
IRP параметр, <значение1,значение2...>
...
ENDM
Директива IRPC описывает блок, который выполняется столько раз, сколько символов содержит указанная строка, и при каждом повторении будет определена метка с именем «параметр», равная очередному символу из строки. Если строка содержит пробелы или другие символы, отличные от разрешенных для меток, она должна быть заключена в угловые скобки.
IRPC параметр, строка
...
ENDM
Чуть выше мы упомянули угловые скобки, являющиеся один из макрооператоров. Следовательно, необходимо разобраться, что они из себя представляют. Итак, макроператоры – специальные операторы, работающие исключительно внутри макроопределений (напоминаем, что блоки повторений – всего лишь разновидность макросов). Рассмотрим наиболее важные из них.
Макрооператор & нужен для того, чтобы операнд «параметр», переданный макроопределению или блоку повторений, заменялся значением до обработки строки ассемблером. Ставятся два макрооператора – в начале и конце «параметра». Бывают ситуации, когда достаточно использовать только один амперсанд – в начале операнда «параметр», если не возникает неоднозначностей.
Макрооператор <> действует так, что весь текст, заключенный в эти скобки, рассматривается как текстовая строка, даже если он содержит пробелы или другие разделители. Обычно используется при передаче текстовых строк в качестве параметров для макросов, а также при передаче списка параметров вложенному макроопределению или блоку повторений.
Макрооператор ! используется аналогично угловым скобкам, но действует только на один следующий символ.
Макрооператор % указывает, что находящийся за ним текст является выражением и должен быть вычислен. Обычно это требуется для того, чтобы передавать в качестве параметра в макрос не само выражение, а его результат.
