Jump to content

Функция пролог и эпилог

(Перенаправлено из пролога функции )

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

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

Пролог и эпилог функций также иногда содержат код защиты от переполнения буфера .

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

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

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

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

	push ebp
	mov	ebp, esp
	sub	esp, N

Непосредственное значение N — это количество байтов, зарезервированных в стеке для локального использования.

Того же результата можно добиться, используя enter инструкция:

	enter	N, 0

Более сложные прологи можно получить, используя другие значения (кроме 0) для второго операнда enter инструкция. Эти прологи помещают несколько указателей базы/фрейма, чтобы обеспечить вложенные функции , как того требуют такие языки, как Паскаль . Однако современные версии этих языков не используют эти инструкции, поскольку в некоторых случаях они ограничивают глубину вложенности. [ нужна ссылка ]

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

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

Данный эпилог обратит эффекты любого из вышеупомянутых прологов (либо полного, либо того, который использует enter). Согласно определенным соглашениям о вызовах, ответственность за очистку аргументов из стека лежит на вызываемом объекте, поэтому эпилог также может включать этап перемещения указателя стека вниз или вверх.

Например, эти три шага можно выполнить на 32-битном языке ассемблера x86 с помощью следующих инструкций:

	mov	esp, ebp
	pop	ebp
	ret

Как и пролог, процессор x86 содержит встроенную инструкцию, выполняющую часть эпилога. Следующий код эквивалентен приведенному выше коду:

	leave
	ret

The leave инструкция выполняет mov и pop инструкции, как указано выше.

Функция может содержать несколько эпилогов. Каждая точка выхода из функции должна либо перейти к общему эпилогу в конце, либо содержать собственный эпилог. Поэтому программисты или компиляторы часто используют комбинацию leave и ret выйти из функции в любой момент. (Например, компилятор C заменил бы return заявление с leave/ ret последовательность).

Дальнейшее чтение

[ редактировать ]
  • де Бойн Поллард, Джонатан (2010). «Поколение функциональных перилогов» . Часто встречающиеся ответы .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c12d1c23a52f3603dee3fd20e466349b__1704473880
URL1:https://arc.ask3.ru/arc/aa/c1/9b/c12d1c23a52f3603dee3fd20e466349b.html
Заголовок, (Title) документа по адресу, URL1:
Function prologue and epilogue - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)