PUSH            Push Operand on Stack                Flags: Not altered

PUSH source

Logic eSP ← eSP - n
[SS:eSP] ← source
; n = 2 if operand-size attribute is 16 bits, else 4

If the operand-size attribute of the instruction is 16 bits, PUSH
decrements the stack pointer by 2, otherwise by 4. Then the source
operand is copied to the new top of stack which is pointed to by
the stack pointer (SS:SP if stack address-size attribute is 16
bits, SS:ESP if stack address-size attribute is 32 bits).

The operand for PUSH must be a general register, a segment
register, a memory operand, or (80186+) an immediate value. A full
word/doubleword is pushed onto the stack even if the operand
refers to a byte-sized value.


Example: push [mem_op]
pop [mem_op_copy]

PUSH SP
The 8086 and 80186 processors decrement the stack pointer before
pushing it onto the stack with a PUSH SP instruction. The 80286 and
later processors push the value of SP/ESP before it's decremented.


Opcode Format
06 PUSH ES
0E PUSH CS
0F A0 PUSH FS
0F A8 PUSH GS
16 PUSH SS
1E PUSH DS
50+rw PUSH r16
50+rd PUSH r32
68 PUSH imm16
68 PUSH imm32
6A PUSH imm8
FF /6 PUSH m16
FF /6 PUSH m32


Length and timing
Operands Bytes 8088 186 286 386 486 Pentium
reg 1 15 10 3 2 1 1 UV
mem 2+d(0-2) 24+EA 16 5 5 4 2 NP
seg 1 14 9 3 2 3 1 NP
imm 1+i(1,2) - - 3 2 1 1 NP
FS/GS 2 - - - 2 3 1 NP