Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
ENTER
Влияние команды на флаги и форматы команды:
C8 iw 00 |
ENTER imm16,0 |
Создать кадр стека для процедуры |
Intel286 |
enter 4,0 |
C8 iw 01 |
ENTER imm16,1 |
Создать вложенный кадр стека для процедуры |
Intel286 |
enter 5,1 |
C8 iw ib |
ENTER imm16,imm8 |
Создать вложенный кадр стека для процедуры |
Intel286 |
enter 9,6 |
Описание:
Команда ENTER создает кадр стека, необходимый большинству блочно-структурных языков программирования высокого уровня. Первый операнд указывает, какое количество байт памяти выделяется в стеке для процедуры, в которую осуществляется вход. Второй операнд дает лексический уровень вложенности (от 0 до 31) процедуры внутри исходного кода. Он определяет количество указателей кадра стека, скопированных в новый кадр стека из предыдущего кадра.
Атрибут размера операнда и атрибут размера стека используются, чтобы определить: BP или EBP используется для указателя кадра, и SP или ESP — для указателя стека.
Если атрибут размера операнда равен 16 бит, то процессор использует регистр BP в качестве указателя кадров, если только атрибут размера стека не равен 32 бита, тогда он использует EBP для указателя кадра и ESP для указателя стека. Если атрибут размера операнда равен 32 бита, то процессор использует регистр EBP в качестве указателя кадров и регистр ESP в качестве указателя стека, если только атрибут размера стека не равен 16 бит, тогда он использует BP для указателя кадра и SP для указателя стека.
Если второй операнд равен нулю, тогда команда ENTER помещает в стек указатель кадра (регистр BP или EBP), затем команда ENTER вычитает первый операнд из указателя стека и устанавливает указатель кадра равным текущему значению указателя стека.
Например, подпрограмма, имеющая 12 байт локальных переменных, должна иметь в своей точке входа команду ENTER 12,0 и команду LEAVE перед каждой командой RET. 12 локальных байт будут адресоваться отрицательными смещениями от указателя кадра.
Операция:
level = level MOD 32
2ndOperand = 2ndOperand MOD 32
IF OperandSize = 16 THEN Push(BP); ELSE Push(EBP); FI;
IF StackAddrSize = 16 THEN FramePtr = SP; ELSE FramePtr = ESP; FI;
FOR i = 1 TO (2ndOperand - 1)
DO
IF OperandSize = 16
THEN
IF StackAddrSize = 16
THEN
BP = BP - 2;
Push([BP]); (* Помещает слово в стек *)
ELSE (* StackAddrSize = 32 *)
EBP = EBP - 2;
Push([EBP]); (* Помещает слово в стек *)
FI;
ELSE (* OperandSize = 32 *)
IF StackAddrSize = 16
THEN
BP = BP - 2;
Pushd([BP]); (* Помещает двойное слово в стек *)
ELSE (* StkSize = 32 *)
EBP = EBP - 2;
Pushd([EBP]); (* Помещает двойное слово в стек *)
FI;
FI;
OD;
IF StackAddrSize = 16
THEN
Push(FramePtr); (* Помещает слово в стек *)
ELSE
Pushd(FramePtr); (* Помещает двойное слово в стек *)
FI;
IF StackAddrSize = 16
THEN
BP = FramePtr;
SP = SP - 1stOperand;
ELSE
EBP = FramePtr;
ESP = ESP - 1stOperand;
FI;
Особые ситуации защищенного режима:
#SS(0), если значение SP или ESP превысит предел стека в любой точке во время выполнения команды.
#PF(Код ошибки), при страничной ошибке.
Особые ситуации режима реальной адресации:
#SS, если значение SP или ESP превысит предел стека в любой точке во время выполнения команды.
Особые ситуации режима V86:
#SS(0), если значение SP или ESP превысит предел стека в любой точке во время выполнения команды.
#PF(Код ошибки), при страничной ошибке.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru