Команды ENTER и LEAVE служат для упрощения работы с процедурами, написанными на языках высокого уровня. В таких языках, как C или Pascal обычно при вызове процедуры параметры передаются через стек. Локальные переменные в процедурах также используют стек для хранения своих значений. Рассмотрим подробнее как происходит вызов таких процедур.

Будем для удобства рассматривать 32-битную адресацию. Для 16-битной соответственно вместо регистра ESP будет регистр SP, а также все смещения будут кратны 2, а не 4.

Перед вызовом процедуры все необходимые ей параметры должны быть помещены в стек. Для этого используется команда PUSH, либо прямая запись в стековую область памяти, при этом регистр ESP уменьшается на соответствующее количество байт. После помещения всех параметров в стек, происходит вызов процедуры с помощью команды CALL. При этом в стек помещается адрес следующей команды в качестве адреса возврата для команды RET, и в регистр EIP помещается адрес вызываемой процедуры, что приводит к выполнению первой инструкции процедуры. Таким образом для вызванной процедуры стек будет выглядеть следующим образом: по смещению ESP+0 будет находиться адрес возврата из процедуры, а по адресам ESP+4 и выше - параметры процедуры, переданные ей при вызове.

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

		push ebp        ; Сохраняем EBP
		mov ebp, esp    ; В EBP записываем указатель на стек
		sub esp, 8      ; В стеке выделяем место под две переменные

Далее с параметрами процедуры можно работать через положительное смещение относительно регистра EBP, начиная с EBP+8. С локальными же переменными можно будет работать через отрицательные смещения, например EBP-4 для второй переменной, EBP-8 для первой переменной.

После завершения работы процедуры необходимо вернуть стек в изначальное состояние

		mov esp, ebp   ;Восстановление указателя стека
		pop ebp        ;Восстановление EBP
		ret 2          ;Возврат из процедуры

Команды ENTER и LEAVE позволяют сократить вышеприведенный код. Команда ENTER выполняет выделение кадра стека после входа в процедуру, а команда LEAVE освобождает стек на выходе из нее.

 

Команда ENTER
Синтаксис: ENTER op1,op2
Операнды: op1 - i16
op1 - i8
Назначение: Создание кадра стека для параметров процедуры
Процессор: 80386+
Флаги: Не изменяются
Комментарий: Команда ENTER создает кадр стека, требуемый для большинства языков высокого уровня. Первый операнд задает число байтов памяти, выделяемой в стеке при вхождении в процедуру. Второй операнд задает уровень вложенности процедуры в исходном коде языка высокого уровня. Он определяет число указателей кадра стека, копируемых в новый кадр стека из предыдущего.
Если текущая разрядность равна 16 битам, процессор использует регистр BP в качестве указателя кадра и регистр SP в качестве указателя стека. Если разрядность равна 32 битам, то процессор использует регистры EBP и ESP соответственно.
Ограничения: Нет
Примеры:
enter	12,0
Команда LEAVE
Синтаксис: LEAVE
Операнды: Нет
Назначение: Выход из процедуры высокого уровня
Процессор: 80386+
Флаги: Не изменяются
Комментарий: Команда LEAVE имеет действие, противоположное команде ENTER. Фактически команда LEAVE только копирует содержимое EBP в ESP, тем самым выбрасывая из стека весь кадр, созданный командой ENTER, и считывает из стека значение регистра EBP для предыдущей процедуры.
Ограничения: Нет
Примеры:
leave
ret