Оперативная память

         

Пролог и эпилог



Пролог и эпилог

В процессе компиляции подпрограммы Макроассемблер включает в объектный модуль две группы команд, одна из которых называется прологом (prologue), а другая эпилогом (epilogue). Пролог вставляется перед основным текстом подпрограммы, а эпилог перед командой ret. Вставляемые команды вам уже известны.

Стандартный вариант пролога содержит следующие две команды:

push bp ; сохранение исходного содержимого bx
mov bp, sp ; bx = адрес верхушки стека

Соответственно эпилогом являются команды

pop bp ; восстановление содержимого регистра bx
ret N ; изменение команды ret зависит от langtype

Если значением Langtype является Basic, Fortran или Pascal, то при формировании эпилога к команде ret будет добавлен суммарный размер параметров в байтах для очистки стека при возврате из подпрограммы. Если значением Langtype является С, то команда ret не изменяется, а в текст вызывающего модуля вставляется команда add sp, N.

Обычно команды пролога и эпилога отсутствуют в листинге. Для того чтобы они в нем оказались в начале текста модуля, укажите директиву .Listaii (точка перед именем обязательна).

Пролог и эпилог можно как исключить, так и расширить. Для исключения пролога в текст модуля перед описанием сегмента включается директива

OPTION PROLOGUE: NONE

Аналогичная директива существует и для эпилога, но ее использовать не обязательно. Макроассемблер вставляет эпилог только перед командой ret, поэтому для исключения эпилога достаточно использовать имена retn, retf или ret N, в зависимости от обстоятельств. Обратите внимание, наличие или отсутствие эпилога не влияет на включение команды add sp, N, поскольку она расположена в другом программном модуле.

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

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

Если процедура содержит свой сегмент данных, то в пролог можно включить команды переопределения содержимого регистра ds, при этом в эпилог добавляется команда, восстанавливающая из стека исходное значение регистра ds. Для выполнения этих действий в описание процедуры включается спецификатор <ioadds> (угловые скобки обязательны).

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

Оформление процедуры cnvindec. В комплект поставки Макроассемблера входят исходные тексты программных модулей, ил тюстрирующие различные случаи применения директивы PROC. Тем не менее автор счел целесообразным показать, что изменится в тексте процедуры cnvindec (см. пример В.5), если в ее описание включить полную форму директивы PROC. Измененный текст приведен в примере В.7.



Содержание раздела