Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700383.doc
Скачиваний:
15
Добавлен:
01.05.2022
Размер:
4.33 Mб
Скачать

9.6. Макроязыки и макрогенерация

9.6.1. Определения макрокоманд и макрогенерации

Разработка программ на языке ассемблера – достаточно трудоемкий процесс, для облегчения труда разработчика были созданы так называемые макрокоманды.

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

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

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

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

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

9.6.2. Примеры макрокоманд

Синтаксис макрокоманд и макроопределений зависит от реализации макропроцессора. Но сам принцип выполнения макроподстановок в тексте программы неизменен и не зависит от их синтаксиса.

Пример 1. Следующий текст макроопределения определяет макрокоманду push_0 в языке ассемблера процессора типа Intel 8086:

push_0 macro

хог ах, ах

push ax

endm

Семантика этой макрокоманды заключается в записи числа «0» в стек через регистр процессора ах. Тогда везде в тексте программы, где встретится макрокоманда

push_0

она будет заменена в результате макроподстановки на последовательность команд:

хог ах, ах

push ax

Это самый простой вариант макроопределения.

Пример 2. Существует возможность создавать более сложные макроопределения с параметрами. Одно из таких макроопределений описано ниже:

add_abx macro xl, x2

add ax, xl

add bx, xl

add cx,x2

push ax

endm

Тогда в тексте программы макрокоманда также должна быть указана с соответствующим числом параметров. В данном примере макрокоманда

add_abx 4, 8

будет в результате макроподстановки заменена на последовательность команд:

add ax, 4

add bx, 4

add ex, 8

push ax

Пример 3. Во многих макропроцессорах возможны более сложные конструкции, которые могут содержать локальные переменные и метки. Примером такой конструкции может служить макроопределение:

loop_ax macro xl, x2, yl

local loopax

mov ax, xl

xor bx, bx

loopax: add bx, yl

sub ax, x2

jge loopax

endm

Здесь метка loopax является локальной, определенной только внутри данного макроопределения. В этом случае уже не может быть выполнена простая текстовая подстановка макрокоманды в текст программы, поскольку если данную мак­рокоманду выполнить дважды, то это приведет к появлению в тексте программы двух одинаковых меток loopax. В таком варианте макрогенератор должен использовать более сложные методы текстовых подстановок, аналогичные тем, что ис­пользуются в компиляторах при идентификации лексических элементов входной программы, чтобы дать всем возможным локальным переменным и меткам макрокоманд уникальные имена в пределах всей программы.