Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the use of "push %ebp; movl %esp, %ebp" generated by GCC for x86?

Tags:

x86

gcc

assembly

What effect these two instructions cause in the assembly code generated by gcc for x86 machines:

push %ebp movl %esp, %ebp 
like image 466
mahesh Avatar asked Mar 25 '10 12:03

mahesh


People also ask

Why do we push EBP?

push ebp preserves ESP, the previous stack frame pointer, this is so it can be returned to at the end of the function. A stack frame is used to store local variables and each function will have its own stack frame in memory. mov ebp, esp moves the current stack position into EBP which is the base of the stack.

What is a push assembly language?

The push instruction places its operand onto the top of the hardware supported stack in memory. Specifically, push first decrements ESP by 4, then places its operand into the contents of the 32-bit location at address [ESP].

What is EBP in assembly language?

address of the top of the stack. base pointer (EBP): register containing the. address of the bottom of the stack frame. instruction pointer (EIP): register containing. the address of the instruction to be executed.

What is ESP in assembly language?

The ESP register is the stack pointer for the system stack. It is rarely changed directly by a program but is changed when data is pushed onto the stack or popped from the stack. One use for the stack is in procedure calls. the address of the instructions following the procedure call instruction is stored on the stack.


2 Answers

unwind's explanation is the literal truth (one minor directional error notwithstanding), but doesn't explain why.

%ebp is the "base pointer" for your stack frame. It's the pointer used by the C runtime to access local variables and parameters on the stack. Here's some typical function prologue code generated by GCC (g++ to be precise) First the C++ source.

// junk.c++ int addtwo(int a) {     int x = 2;      return a + x; } 

This generates the following assembler.

.file   "junk.c++"     .text .globl _Z6addtwoi     .type   _Z6addtwoi, @function _Z6addtwoi: .LFB2:     pushl   %ebp .LCFI0:     movl    %esp, %ebp .LCFI1:     subl    $16, %esp .LCFI2:     movl    $2, -4(%ebp)     movl    -4(%ebp), %edx     movl    8(%ebp), %eax     addl    %edx, %eax     leave     ret .LFE2:     .size   _Z6addtwoi, .-_Z6addtwoi     .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"     .section    .note.GNU-stack,"",@progbits 

Now to explain that prologue code (all the stuff before .LCFI2:), first:

  1. pushl %ebp stores the stack frame of the calling function on the stack.
  2. movl %esp, %ebp takes the current stack pointer and uses it as the frame for the called function.
  3. subl $16, %esp leaves room for local variables.

Now your function is ready for business. Any references with a negative offset from the %ebp% register are your local variables (x in this example). Any references with a positive offset from the %ebp% register are your parameters passed in.

The final point of interest is the leave instruction which is an x86 assembler instruction which does the work of restoring the calling function's stack frame. This is usually optimized away in to the faster move %ebp %esp and pop %ebp% sequence in C code. For illustrative purposes, however, I didn't compile with any optimizations on at all.

like image 191
JUST MY correct OPINION Avatar answered Nov 08 '22 11:11

JUST MY correct OPINION


It's typical code that you see at the beginning of a function.

It saves the contents of the EBP register on the stack, and then stores the content of the current stack pointer in EBP.

The stack is used during a function call to store local arguments. But in the function, the stack pointer may change because values are stored on the stack.

If you save the original value of the stack, you can refer to the stored arguments via the EBP register, while you can still use (add values to) the stack.

At the end of the function you will probably see the command

pop %ebp   ; restore original value  ret        ; return  
like image 36
Roalt Avatar answered Nov 08 '22 12:11

Roalt