我有一个调用另一个函数的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语句具有相同的值,因为它们在进入函数之前都给出了堆栈的顶部?
答案 0 :(得分:0)
如果你对函数序言是正确的,
push %ebp
movl %esp, %ebp
那么调用函数之前的esp和函数中的esp之间的区别应该是8个字节,而不是2:4个字节用于返回地址,4个字节用于保存的ebp值。