int main(){
int i;
}
我在调用函数后在gdb中做$ebp-$esp
它给了我4.但是旧ebp
呢?我可以认为这个函数在堆栈上需要8个字节吗? int
为4个字节,旧ebp
为4个字节。
注意 - 我使用-mpreferred-stack-boundary=2 -march=i386
答案 0 :(得分:1)
完全取决于编译器如何决定优化函数。一些优化编译器可能会将此函数构建为“main: ret
”的行,导致它根本不使用堆栈空间。
答案 1 :(得分:1)
假设您在没有优化的情况下进行编译,那么您不会计算旧的ebp,因为在将旧的ebp推入堆栈后,esp会被复制到ebp。我认为你所看到的是gcc节省ecx,虽然我不知道为什么会这样做。
答案 2 :(得分:0)
该函数需要多少内存将完全取决于您正在使用的编译器。这是使用gcc 4.6.2和编译命令反汇编上面的代码:
gcc -mpreferred-stack-boundary=2 -march=i386 -m32 -o test test.c
0x08048394 <+0>: push ebp
0x08048395 <+1>: mov ebp,esp
0x08048397 <+3>: pop ebp
0x08048398 <+4>: ret
显而易见的是i
被忽略,因为根本没有使用它。因此,堆栈中有4个字节用于call
推送的返回地址,另外4个用于保留ebp
。
正如您所期望的那样,如果您使用-O1
编译标志启用了轻微优化,则会变为:
0x08048394 <+0>: ret
由于根本不需要堆栈帧,main
什么都不做。