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

Макропроцессоры. (1) понятия о макропроцессорах.

В рамках ассемблера используют своеобразный подход – макропроцессор, который позволяет записать более компактно, часто используемые группы команд исходного языка. Известны подпрограммы, которые по своим функциям выполняют тоже самое. Но возможности макропроцессора и подпрограмм несколько различны. Цель введения макропроцессора – сохранить объем представляемой программы за счет объединения группы команд в одну запись. Принципиальное отличие макропроцессора и подпрограмм – подпрограмма храниться в памяти один раз, записана в одной группе адресов. Предложения инициированное макроинструкциями записывается в выполняемой программе каждый раз и в полном объеме, при обращении к такой макрокоманде. Против программ макрокоманды имеют одно преимущество: они могут модифицироваться каждый раз при каждом новом обращении, в зависимости от записанных в них параметрах. Подпрограмма не изменна. Начало макроопределения – первое предложение (строка). В поле метки записывается имя макроопределения. В поле операнда находятся имена формальных макропараметров. Причем эти имена начинаются специальным символом. Имя вместе с параметрами определяют шаблон или протокол используемой макрокоманды. Сразу после строки описания помещают тело макропрограммы. Оно включает обычные ассемблерные команды и правила записи согласно ассемблера. Конец макропрограммы – директива MEND. После этой команды может располагаться основная программа, в произвольной строке которой встречается вызов макроинструкций. Результирующая программа после трансляции не содержит определений макропрограмм, поскольку они уже не нужны. Но каждое обращение к макрокоманде передает в память набор кодов команд, описанных ранее. Между аргументами и параметрами устанавливается жесткое позиционное соответствие: первый аргумент макрокоманды – первый параметр в оттранслированной версии. Если параметр не нужно помечать, он кодируется пустым словом. После расшифровки макрокоманд, программа представляет обычный ассемблерный файл. Для того, чтобы присвоить соответствующие адреса меткам макрокоманд необходимо два прохода. На первом обрабатываются имена макрокоманд, на втором их содержимое. Но при этом возникает одно ограничение – из макрокоманды не возможно обратиться к другой подпрограмме. Т.е. нельзя писать вложенные структуры. Выход отсюда – использовать макропроцессор, который может переключаться с обработки макроопределений на выполнение и наоборот. Необходимо выполнить при этом одно условие. В исходной программе любые макроопределения должны появляться до соответствующих групп программ. Аналогично с ассемблерным макропроцессором допускают использование стандартных системных библиотек. В этом случае нет необходимости вписывать в исходный текст программы содержание такой макрокоманды, она извлекается из библиотеки.

Большинство макропроцессоров допускают объединение параметров с другими строками. С этой целью после текста макропрограммы добавляют оператор, который связывает последнюю команду макроса со следующей команда основной программы. В оттранслированном файле этот оператор отсутствует. Как правило, внутри макропрограммы не содержится основных меток, следовательно используют относительную адресацию. Но относительная адресация в данных программах затруднена. Поэтому для обращения к далеко расположенным командам используют метки специального вида. Метка включает спец символы и цифровой код счетчика. Код увеличивается по мере добавления ссылок. Поскольку макрокоманды конкурируют с подпрограммами и по объему в памяти им проигрывают. В макропроцессорах предусмотрены дополнительные возможности по изменению генерируемых объектных кодов. При обращении, вызове макрокоманды указываются параметры в зависимости от величины аргумента из исходной макропрограммы. В объектный файл транслируются не все команды, а лишь те, которые участвуют в преобразовании. Например: проверка условия «1» «0», направляет вычисления на определенную группу команд. Другая группа задействуется по обратному значению параметра. Получается, что в память транслируется только «рабочие команды». Вторая возможность, если предусмотреть в макропрограмме циклическое выполнение, то число циклов можно определить внешним параметром. Для различных условий оно различно. Возможность подобных изменений и позволяет конкурировать макрокомандам с подпрограммами.