Команды ENTER, LEAVE
Команды 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 |
Комментарии (0)