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.