80386 Programmer's Reference Manual -- Opcode PUSH
PUSH -- Push Operand onto the Stack
IF StackAddrSize = 16 THEN IF OperandSize = 16 THEN SP := SP - 2; (SS:SP) := (SOURCE); (* word assignment *) ELSE SP := SP - 4; (SS:SP) := (SOURCE); (* dword assignment *) FI; ELSE (* StackAddrSize = 32 *) IF OperandSize = 16 THEN ESP := ESP - 2; (SS:ESP) := (SOURCE); (* word assignment *) ELSE ESP := ESP - 4; (SS:ESP) := (SOURCE); (* dword assignment *) FI; FI;
DescriptionPUSH decrements the stack pointer by 2 if the operand-size attribute of the instruction is 16 bits; otherwise, it decrements the stack pointer by 4. PUSH then places the operand on the new top of stack, which is pointed to by the stack pointer.
The 80386 PUSH eSP instruction pushes the value of eSP as it existed before the instruction. This differs from the 8086, where PUSH SP pushes the new value (decremented by 2).
Protected Mode Exceptions#SS(0) if the new value of SP or ESP is outside the stack segment limit; #GP(0) for an illegal memory operand effective address in the CS, DS, ES, FS, or GS segments; #SS(0) for an illegal address in the SS segment; #PF(fault-code) for a page fault
Real Address Mode ExceptionsNone; if SP or ESP is 1, the 80386 shuts down due to a lack of stack space
Virtual 8086 Mode ExceptionsSame exceptions as in real-address mode; #PF(fault-code) for a page fault