Take the 2-minute tour ×

When reading about assembler I often come across people writing that they push a certain register of the processor and pop it again later to restore it's previous state.

  • How can you push a register? Where is it pushed on? Why is this needed?
  • Does this boil down to a single processor instruction or is it more complex?
share|improve this question
Warning: all the current answers are given in Intel's assembly syntax; push-pop in AT&T syntax for example uses a post-fix like b, w, l, or q to denote the size of the memory being manipulated. Ex: pushl %eax and popl %eax –  Hawken Apr 14 '12 at 16:34
@hawken On most assemblers able to swallow AT&T syntax (notably gas) the size postfix can be omitted if the operand size can be deduced from the operand size. This is case for the examples you have given, as %eax is always 32 bit in size. –  hirschhornsalz May 2 '12 at 9:38
add comment

3 Answers 3

up vote 31 down vote accepted

pushing a value (not necessarily stored in a register) means writing it to the stack.

popping means restoring whatever is on top of the stack into a register. Those are basic instructions:

push 0xdeadbeef      ; push a value to the stack
pop eax              ; eax is now 0xdeadbeef

; swap contents of registers
push eax
mov eax, ebx
pop ebx
share|improve this answer
add comment

Here is how you push a register. I assume we are talking about x86.

push ebx
push eax

It is pushed on stack. The value of ESP register is decremented to size of pushed value as stack grows downwards in x86 systems.

It is needed to preserve the values. The general usage is

push eax           ;   preserve the value of eax
call some_method   ;   some method is called which will put return value in eax
mov  edx, eax      ;    move the return value to edx
pop  eax           ;    restore original eax

A push is a single instruction in x86, which does two things internally.

  1. Store the pushed value at current address of ESP register.
  2. Decrement the ESP register to size of pushed value.
share|improve this answer
add comment

Almost all CPUs use stack. The program stack is LIFO technique with hardware supported manage.

Stack is amount of program (RAM) memory normally allocated at the top of CPU memory heap and grow (at PUSH instruction the stack pointer is decreased) in opposite direction. A standard term for inserting into stack is PUSH and for remove from stack is POP.

Stack is managed via stack intended CPU register, also called stack pointer, so when CPU perform POP or PUSH the stack pointer will load/store a register or constant into stack memory and the stack pointer will be automatic decreased xor increased according number of words pushed or poped into (from) stack.

Via assembler instructions we can store to stack:

  1. CPU registers and also constants.
  2. Return addresses for functions or procedures
  3. Functions/procedures in/out variables
  4. Functions/procedures local variables.
share|improve this answer
add comment

Your Answer


