帧指针,epb和返回地址

时间:2010-12-13 06:18:44

标签: assembly windbg callstack calling-convention

以下图片来自维基百科entry,在调用堆栈上有一些我完全不理解的内容:

alt text

我认为存储在ebp寄存器中的帧指针在序言中被初始化*:

push ebp  ; Preserve current frame pointer 
mov ebp, esp ; Create new frame pointer pointing to current stack top 
sub esp, 20 ; allocate 20 bytes worth of locals on stack. 

如果是这样的话,那么图像中的帧指针不应该指向返回地址之后,它应该是前一帧指针地址之前和之前的返回地址吗?我错过了什么?

谢谢!

*取自:What is exactly the base pointer and stack pointer? To what do they point?

2 个答案:

答案 0 :(得分:6)

是的,你是对的,帧指针指向一个地址,在该地址存储前一帧指针,返回地址之前。正确的图片将是

               | locals
               +---------
frame pointer->| prev frame pointer
               +--------
               | return address
               +--------

答案 1 :(得分:0)

调用该函数时。返回地址被压入堆栈,堆栈指针现在指向返回地址。 这是函数内部发生的事情:

push ebp  ; Push the ebp; The ebp address will pushed on stack and sp will be decremented
mov ebp, esp ;  EBP will now point the same as ESP which is previous value of EBP
sub esp, 20 ;    ESP will be subtracted further to create frame for local variables

结果是: EBP指向EBP的先前值。 ESP指向ESP的另外20个字节。这20个字节将用于本地变量。