操作碼 |
指令 |
說明 |
C8 iw 00 |
ENTER imm16,0 |
為過程建立堆疊幀 |
C8 iw 01 |
ENTER imm16,1 |
為過程建立巢狀堆疊幀 |
C8 iw ib |
ENTER imm16,imm8 |
為過程建立巢狀堆疊幀 |
為過程建立堆疊幀。第一個運算元(大小運算元)指定堆疊幀的大小(即堆疊上給過程分配的動態儲存空間位元組數)。第二個運算元(巢狀層數運算元)給出過程的詞法巢狀層級(0 到 31)。巢狀層級確定要從上一幀複製到新堆疊幀“顯示區”的堆疊幀指針數。這兩個運算元都是立即數。
堆疊大小屬性確定是由 BP(16 位)還是 EBP(32 位)暫存器指定當前幀指針,以及是由 SP(16 位)還是 ESP(32 位)指定堆疊指針。
ENTER 與伴隨的 LEAVE 指令提供用於支援塊結構語言。ENTER 指令(使用時)通常是過程中的第一條指令,用於為過程建立新的堆疊幀。然後,在過程的末尾(就在 RET 指令的前面),使用 LEAVE 指令釋放堆疊幀。
如果巢狀層級為 0,則處理器將幀指針從 EBP 暫存器壓入堆疊,將目前堆疊指針從 ESP 暫存器複製到 EBP 暫存器,並將目前堆疊指針值減去大小運算元中的值之後的結果載入到 ESP 暫存器。如果巢狀層級大於或等於 1,則處理器在調整堆疊指針之前,先將其它幀指針壓入堆疊。這些額外的幀指針為被呼叫過程訪問堆疊上的其它巢狀幀提供訪問點。如需有關 ENTER 指令操作的詳細資訊,請參閱“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 1 卷第 6 章中的“塊結構語言的過程呼叫”。
NestingLevel NestingLevel MOD 32
IF StackSize 32
THEN
Push(EBP) ;
FrameTemp ESP;
ELSE (* StackSize 16*)
Push(BP);
FrameTemp SP;
FI;
IF NestingLevel 0
THEN GOTO CONTINUE;
FI;
IF (NestingLevel > 0)
FOR i 1 TO (NestingLevel - 1)
DO
IF OperandSize 32
THEN
IF StackSize 32
EBP EBP - 4;
Push([EBP]); (* doubleword push *)
ELSE (* StackSize 16*)
BP BP - 4;
Push([BP]); (* doubleword push *)
FI;
ELSE (* OperandSize 16 *)
IF StackSize 32
THEN
EBP EBP - 2;
Push([EBP]); (* word push *)
ELSE (* StackSize 16*)
BP BP - 2;
Push([BP]); (* word push *)
FI;
FI;
OD;
IF OperandSize 32
THEN
Push(FrameTemp); (* doubleword push *)
ELSE (* OperandSize 16 *)
Push(FrameTemp); (* word push *)
FI;
GOTO CONTINUE;
FI;
CONTINUE:
IF StackSize 32
THEN
EBP FrameTemp
ESP EBP - Size;
ELSE (* StackSize 16*)
BP FrameTemp
SP BP - Size;
FI;
END;
無。
#SS(0) - 如果 SP 或 ESP 暫存器的新值超出堆疊段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#SS(0) - 如果 SP 或 ESP 暫存器的新值超出堆疊段限制。
#SS(0) - 如果 SP 或 ESP 暫存器的新值超出堆疊段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。