RET—Return from Procedure (Continued)
IF stack segment not present THEN #SS(StackSegmentSelector); FI;
IF the return instruction pointer is not within the return code segment limit THEN #GP(0); FI:
CPL ReturnCodeSegmentSelector(RPL);
IF OperandSize=32
THEN
ELSE (* OperandSize=16 *)
FI;
FOR each of segment register (ES, FS, GS, and DS)
DO;
OD;
For each of ES, FS, GS, and DS
DO
IF segment descriptor indicates the segment is not a data or
OD;
Flags Affected
None.
Volume 4: Base IA-32 Instruction Reference
EIP Pop();
CS Pop(); (* 32-bit pop, high-order 16-bits discarded *)
(* segment descriptor information also loaded *)
CS(RPL) CPL;
ESP ESP + SRC;
tempESP Pop();
tempSS Pop(); (* 32-bit pop, high-order 16-bits discarded *)
(* segment descriptor information also loaded *)
ESP tempESP;
SS tempSS;
EIP Pop();
EIP EIP AND 0000FFFFH;
CS Pop(); (* 16-bit pop; segment descriptor information also loaded *)
CS(RPL) CPL;
ESP ESP + SRC;
tempESP Pop();
tempSS Pop(); (* 16-bit pop; segment descriptor information also loaded *)
(* segment descriptor information also loaded *)
ESP tempESP;
SS tempSS;
IF segment register points to data or non-conforming code segment
AND CPL > segment descriptor DPL; (* DPL in hidden part of segment register *)
THEN (* segment register invalid *)
SegmentSelector/Descriptor 0; (* null segment selector *)
FI;
readable code segment
OR if the segment is a data or non-conforming code segment and the segment
descriptor's DPL < CPL or RPL of code segment's segment selector
THEN
segment selector register null selector;
4:343