Лекция: Макроопределения и макрокоманды

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

Дисплей памяти процедуры (функции) — это область данных, доступных для обработки в этой процедуре (функции). Для облегчения труда разработчика были созданы так называемые макрокоманды.

Макрокоманда — это текстовая подстановка, в ходе выполнения которой каждый идентификатор определенного вида заменяется на цепочку символов из некоторого хранилища данных.

С макрокомандами связаны понятия макрогенерация, макрорасширение, макроподстановка и макропроцессор.

Макрогенерация — процесс выполнения макрокоманды.

Макрорасширение — это цепочка символов, получаемая в результате выполнения макрокоманды.

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

Макроподстановка — это текстовая замена одной цепочки символов (идентификатора) на другую цепочку символов (строк).

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

Макропроцессор (макрогенератор) — это специальный модуль, обрабатывающий макрокоманды и макроопределения.

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

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

Задание макрокоманды:

push_stack macro

push r16

push r17

push PSW

endm

Семантика этой макрокоманды заключается в записи в стек регистров r16, r17, PSW. Когда в тексте встретиться макрокоманда «push_stack macro», она будет заменена в результате макроподстановки на последовательность команд: push r16, push r17, push

PSW.

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

 

еще рефераты
Еще работы по информатике