esp和ebp在函数调用中注册行为

时间:2017-09-03 21:41:22

标签: assembly x86

我有一个调用另一个函数的main函数。我在许多地方读过,当函数调用发生时会发生以下情况:

push %ebp
movl %esp, %ebp

我的目标是在函数调用之前和之后找到堆栈的顶部。 以下是我的主要内容:

#include <stdio.h>
long *ebp;
int main(){
    asm("movl %ebp,ebp");
    printf("Top of stack before calling function 0x%08x",ebp);
    func();
    return 0;
}
long *ebp;
long *ebp;
void func(){
    asm("movl %esp,esp");
    asm("movl %ebp,ebp");
    printf("\n\n Top of stack after entering function 0x%08x",ebp);
    printf("\n\n Top of stack before entering function 0x%08x",ebp+2);
}

我的问题是,main中的print语句是否应该与func中的第二个print语句具有相同的值,因为它们在进入函数之前都给出了堆栈的顶部?

1 个答案:

答案 0 :(得分:0)

如果你对函数序言是正确的,

push %ebp
movl %esp, %ebp

那么调用函数之前的esp和函数中的esp之间的区别应该是8个字节,而不是2:4个字节用于返回地址,4个字节用于保存的ebp值。