Что такое ассемблер?
Языки ассемблеров
Команды языка ассемблера
Код операции
Псевдооперации
Литералы
Свободный формат команд
Некоторые типичные команды ассемблера для машин с побайтовой организацией
Ассемблеры типа «трансляция — выполнение»
Однопроходный ассемблер
Двухпроходный ассемблер
Символы
Подробная блок-схема прохода
Подробная блок-схема прохода 2
Пример трансляции
Таблицы символов общие замечания
Обработка таблицы
Линейный поиск
Двоичный поиск
Сравнение двоичного и линейного способов поиска
Метод хеширования
Пример хеширования
Скученность
Назначение макрокоманды
Различие между макрокомандами и подпрограммами
Форматы макрокоманды
Ключевой макрос
Макропроцессор

Форматы макрокоманды

Каждый макрос, для того чтобы его можно было вызывать, должен быть предварительно определен. Такое определение может быть выполнено либо в начале программы, либо в отдельном запуске. В последнем случае макрос помещается в библиотеку макросов и становится доступным произвольной программе. Библиотека макросов содержит не только макросы, определенные программистами на данной вычислительной установке, но также и системные макросы (такие, как GET, PUT, DTFSR, DCB и т. д.), поставляемые с серийным программным обеспечением. Каждое макроопределение, т. е. определение макроса, должно начинаться со слова MACRO и заканчиваться словом MEND в поле операции. Предложение, следующее за MACRO, содержит имя, посредством которого макрос может вызываться в программе, за которым следует список фиктивных аргументов или параметров (если они есть). Последующие предложения представляют собой тело макроса, т. е. последовательность команд, которая копируется в программу на место макровызова. Во время расширения макроса его команды вставляются в фактическую программу таким образом, что фиктивные аргументы будут заменены фактическими аргументами всякий раз, когда они появляются. Макровызов состоит из возможной метки, имени макроса в поле операции и списка фактических аргументов в поле операнда. Возможность использования фиктивных аргументов, которые могут заменяться при каждом вызове, придает системе значительную гибкость.

На рис. 5.12. и 5.13 показана реализация простого макроса для взаимного обмена содержимым двух переменных, расположенных в основной памяти 1}. Специальный символ & в начале символических имен служит указанием для макропроцессора о том, что данные имена являются фиктивными аргументами, которые должны быть заменены фактическими во время расширения. Из рисунка можно видеть, что всякий раз, когда встречается макровызов EXGHQ, в программу вставляются блоки кодов с одной и той же структурой, но не идентичные.(При работе с этим макросом пользователи сами отвечают за то, чтобы фактические переменные имели одну и ту же длину и чтобы никакая значащая информация не была утрачена при занесении содержимого некоторого параметра в более короткое поле.)
В приведенном примере фактические аргументы связываются с фиктивными аргументами в соответствии с порядком, в котором они появляются в списке аргументов. Таким образом, в первом вызове первый, второй и третий фиктивные аргументы заменяют соответственно А, В и TEMP, во втором — X, Y и TEMP. Этот тип макроса называется позиционным макросом. При вызове позиционного макроса порядок фактических аргументов должен быть точно таким же, как и порядок аргументов в определении макроса. Если отсутствует некоторый фактический аргумент (за исключением последнего или последних), его место должно быть сохранено таким образом, чтобы оставалась возможность корректного сопоставления фактических параметров фиктивным. Отсутствие некоторого аргумента обозначается в списке аргументов с помощью разделителя параметров (запятой), записываемой в позиции, в которой по предположению должен размещаться данный параметр.

Hosted by uCoz