Пролог и эпилог
Пролог и эпилог
В процессе компиляции подпрограммы Макроассемблер включает в объектный модуль две группы команд, одна из которых называется прологом (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, а после него перечисляются используемые в подпрограмме регистры.
Замечание 1
Замечание 1
Разделителем между именами регистров является пробел, указание запятых не допустимо.
Если процедура содержит свой сегмент данных, то в пролог можно включить команды переопределения содержимого регистра ds, при этом в эпилог добавляется команда, восстанавливающая из стека исходное значение регистра ds. Для выполнения этих действий в описание процедуры включается спецификатор <ioadds> (угловые скобки обязательны).
Таким образом, пролог и эпилог позволяют не записывать в основном тексте вспомогательные действия, выполняемые при входе в процедуру и выходе из нее. Целесообразность включения команд пролога и эпилога решается в каждом конкретном случае с учетом назначения процедуры.
Оформление процедуры cnvindec. В комплект поставки Макроассемблера входят исходные тексты программных модулей, ил тюстрирующие различные случаи применения директивы PROC. Тем не менее автор счел целесообразным показать, что изменится в тексте процедуры cnvindec (см. пример В.5), если в ее описание включить полную форму директивы PROC. Измененный текст приведен в примере В.7.