2011-03-20 66 views
0

有叠加成形是堆叠外形

Parameter #N 
... 
... 
Parameter 2 
Parameter 1 
Return Address 
Old %ebp 
Local Variable 1 
Local Variable 2 


I have no idea what `"Old %ebp"` for. 

如果%ebp用于访问返回地址和参数,那么为什么不%ebp点只是

返回地址,而不是"Old %ebp"

是否适合未来用途?

我的问题是

  • Q1。什么是“旧%ebp”,它是什么?第二季度销售价格为
  • 。为什么%ebp指向旧%ebp不只是返回地址?

回答

3

ebp寄存器(基址指针)通常用于处理堆栈帧(堆栈的不同“级别”)。虽然堆栈指针可以根据您推送和弹出的内容进行更改,但基本指针在相同堆栈级别时保持不变。

这样的话,你可以在所有的局部变量得到的ebp一侧(例如,mov ax,[ebp-8])和所有在另一边传递的参数(例如,mov ax,[ebp+12]),以及是相对于ebp任何其他地点,如某些情况下的返回码。

您之所以拥有之前的推送到堆栈上的基本指针的内容是这样,当您移动到前一个堆栈帧时,很容易恢复该值。您只需将该值输入ebp并将其恢复,即可以访问当地人并为下一级传递参数。

This article提供了它如何能工作的图形概览,这是我经常发现无价:

+------------------+ 
+-> | prev-prev EBP | 
| +------------------+ 
| | function param 2 | 
| +------------------+ 
| | function param 1 | 
| +------------------+ 
| | return address | 
| +------------------+ 
+---| previous EBP | <-- current EBP 
    +------------------+ 
    | local var 1 | 
    +------------------+ 

它的工作方式是,你推参数的功能,那么你只需要调用该函数。在函数开始时的序言代码是一样的东西:

push ebp   ; save old base pointer. 
mov ebp, esp  ; set new copy. 
sub esp, 16h  ; allocate space for local variables. 

其保存旧ebp并建立一个新的,指向由调用代码推变量。从堆栈指针中减去是为本地分配空间。

如上所述,这意味着通过参数可以得到与[ebp+N]和当地人与[ebp-N]

的收尾代码是相反的操作:

add esp, 16h  ; forget about locals. 
pop ebp   ; restore previous value 
ret    ; return to calling code. 

之后ebp现在被设置为它的先前值。

0

%ebp是基址指针,所有参数和局部变量都作为基址指针的偏移量来访问。当前的ebp将指向堆栈,具有old %ebp

例如Local Variable 1 is stored at %ebp-4parameter 1 is stored at %ebp+8

"Old %ebp"是调用者函数的基址指针,当calle返回基址指针时,旧调用者被恢复。

要回答第二个问题,它可以做到这一点,但这是惯例。部分是这样的。

push %ebp ; save old ebp to stack, this will become old ebp 
    mov %esp, %ebp ; moving current base pointer to epp 

PS:我主要使用NASM语法,因此可能是