<<<    Index    >>>
3-531
INSTRUCTION SET REFERENCE
POP—Pop a Value from the Stack
Description
This instruction loads the value from the top of the stack to the location specified with the desti-
nation operand and then increments the stack pointer. The destination operand can be a general-
purpose register, memory location, or segment register. 
The current operand-size attribute of the stack segment determines the stack pointer size (16 bits
or 32 bits—the source address size), and the operand-size attribute of the current code segment
determines the amount the stack pointer is incremented (two bytes or four bytes). For example,
if these address- and operand-size attributes are 32, the 32-bit ESP register (stack pointer) is
incremented by four and, if they are 16, the 16-bit SP register is incremented by two. (The B flag
in the stack segment’s segment descriptor determines the stack’s address-size attribute, and the
D flag in the current code segment’s segment descriptor, along with prefixes, determines the
operand-size attribute and also the address-size attribute of the destination operand.)
If the destination operand is one of the segment registers DS, ES, FS, GS, or SS, the value loaded
into the register must be a valid segment selector. In protected mode, popping a segment selector
into a segment register automatically causes the descriptor information associated with that
segment selector to be loaded into the hidden (shadow) part of the segment register and causes
the selector and the descriptor information to be validated (refer to the “Operation” section
below).
A null value (0000-0003) may be popped into the DS, ES, FS, or GS register without causing a
general protection fault. However, any subsequent attempt to reference a segment whose corre-
sponding segment register is loaded with a null value causes a general protection exception
(#GP). In this situation, no memory reference occurs and the saved value of the segment register
is null.
The POP instruction cannot pop a value into the CS register. To load the CS register from the
stack, use the RET instruction.
If the ESP register is used as a base register for addressing a destination operand in memory, the
POP instruction computes the effective address of the operand after it increments the ESP
register. For the case of a 16-bit stack where ESP wraps to 0h as a result of the POP instruction,
the resulting location of the memory write is processor-family-specific.
Opcode
Instruction
Description
8F /0
POP m16
Pop top of stack into m16; increment stack pointer
8F /0
POP m32
Pop top of stack into m32; increment stack pointer
58+ rw
POP r16
Pop top of stack into r16; increment stack pointer
58+ rd
POP r32
Pop top of stack into r32; increment stack pointer
1F
POP DS
Pop top of stack into DS; increment stack pointer
07
POP ES
Pop top of stack into ES; increment stack pointer
17
POP SS
Pop top of stack into SS; increment stack pointer
0F A1
POP FS
Pop top of stack into FS; increment stack pointer
0F A9
POP GS
Pop top of stack into GS; increment stack pointer
<<<    Index    >>>