Стек вызовов функций – это структура данных, организованная по принципу LIFO ("последний пришел - первый ушел"), используемая для управления вызовами функций в программе. Каждый раз, когда вызывается функция, в стеке создается новая запись активации, а после завершения работы функции эта запись удаляется.
Информация, хранящаяся в записи активации функции:
- Локальные переменные функции.
- Аргументы (параметры), переданные в функцию.
- Адрес возврата – адрес инструкции, на которую нужно вернуться после завершения выполнения функции.
- Сохраненные значения регистров, которые использовались функцией.
- Временные области памяти для промежуточных вычислений.
Указатели стека:
-
ESP (Extended Stack Pointer) – хранит адрес вершины стека.
-
EBP (Extended Base Pointer) – хранит адрес базы текущего стекового фрейма. EBP используется для удобного доступа к аргументам и локальным переменным функции, так как их смещение относительно EBP фиксировано.

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

- Вызывающая функция выполняет инструкцию CALL, которая помещает адрес возврата в стек и передает управление вызываемой функции.
- Вызываемая функция сохраняет значение EBP в стеке, а затем копирует текущее значение ESP в EBP, устанавливая новый стековый фрейм.
- Вызываемая функция выделяет место в стеке для локальных переменных и временных данных.

- Вызываемая функция выполняет свой код.
- Перед возвратом вызываемая функция помещает возвращаемое значение в регистр EAX (для значений меньше 4 байт).