RET—Return from Procedure (Continued)
Operation
(* Near return *)
IF instruction = near return
THEN;
IF OperandSize = 32
FI;
IF instruction has immediate operand
THEN IF StackAddressSize=32
FI;
FI;
IF Itanium System Environment AND PSR.tb THEN IA_32_Exception(Debug);
FI;
(* Real-address mode or virtual-8086 mode *)
IF ((PE = 0) OR (PE = 1 AND VM = 1)) AND instruction = far return
THEN;
IF OperandSize = 32
FI;
IF instruction has immediate operand THEN SP SP + (SRC AND FFFFH); FI;
IF Itanium System Environment AND PSR.tb THEN IA_32_Exception(Debug);
FI;
(* Protected mode, not virtual 8086 mode *)
IF (PE = 1 AND VM = 0) AND instruction = far RET
THEN
IF OperandSize = 32
Volume 4: Base IA-32 Instruction Reference
THEN
IF top 12 bytes of stack not within stack limits THEN #SS(0); FI;
EIP Pop();
ELSE (* OperandSize = 16 *)
IF top 6 bytes of stack not within stack limits
THEN #SS(0)
FI;
tempEIP Pop();
tempEIP tempEIP AND 0000FFFFH;
IF tempEIP not within code segment limits THEN #GP(0); FI;
EIP tempEIP;
THEN
ESP ESP + SRC;
ELSE (* StackAddressSize=16 *)
SP SP + SRC;
THEN
IF top 12 bytes of stack not within stack limits THEN #SS(0); FI;
EIP Pop();
CS Pop(); (* 32-bit pop, high-order 16-bits discarded *)
ELSE (* OperandSize = 16 *)
IF top 6 bytes of stack not within stack limits THEN #SS(0); FI;
tempEIP Pop();
tempEIP tempEIP AND 0000FFFFH;
IF tempEIP not within code segment limits THEN #GP(0); FI;
EIP tempEIP;
CS Pop(); (* 16-bit pop *)
THEN
4:341