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

Макропроцессор

Специальная программа макропроцессор реализует функции макроопределений и расширений макровызовов. Макропроцессор выполняет четыре основные задачи:
(a)        Распознавание макроопределений. Это достигается путем сравнения всех кодов операций с псевдооперациями MACRO и MEND, начинающими и заканчивающими макроопределения.
(b)       Хранение макроопределений. Команды макроса, появляющиеся между MACRO и MEND, сохраняются, и отмечаются фиктивные аргументы. С этой целью строятся три таблицы с соответствующими указателями:

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

Массив списка аргументов, содержащий список аргументов, с помощью которого фиктивные аргументы в тексте, записываемом в таблицу макроопределений, заменяются стандартным образом для облегчения последующей обработки.
(c)        Распознавание макровызовов. Построенная ранее таблица имен макросов используется для идентификации псевдоопераций точно так же, как и таблица кодов операций машины в обычном ассемблере.
(d)       Расширение макровызовов и замена фиктивных аргументов фактическими. Для этого текст, хранящийся в таблице макроопределений, копируется в собираемую программу, причем всякий раз, когда в командах появляются фиктивные аргументы, они заменяются фактическими.

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

Двухпроходный макропрепроцессор на первом проходе обрабатывает макроопределения, а на втором — их расширения. Однопроходный препроцессор выполняет обе задачи за один проход. При этом подразумевается, что все макросы должны быть определены перед их фактическим расширением. Данное ограничение не является существенным, поскольку можно потребовать, чтобы все макроопределения размещались в начале программы, и даже для вложенных макросов фактическое расширение внутренних или внешних макросов выполняется не на стадии определения макроса, а при вызове внешнего (определённого ранее) макроса. Как одно-, так и двухпроходные макропрепроцессоры записывают результат своей работы на устройство (магнитной) памяти в виде, пригодном для обычной обработки ассемблером.

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

Основное преимущество объединения макропрепроцессора и прохода 1 ассемблера состоит в том, что, поскольку многие их функции аналогичны или даже идентичны (например, чтение исходного предложения, проверка типа операнда и т. п.), отпадает необходимость в их повторной реализации.

Hosted by uCoz