【发布时间】:2015-04-04 03:02:18
【问题描述】:
我看不出我做错了什么,这是我的 C 代码:
main() {
int i = 0;
if (i == 0) i++;
return 0;
}
使用 gcc -S test.c 编译
我期待的是“leave”而不是“popq %rbp”。
.L2:
movl $0, %eax
popq %rbp
ret
【问题讨论】:
-
main()应该是int main(void) -
编译时添加-fomit-frame-pointer并观察输出。
-
当
%rsp仍然指向正确的位置时,不需要leave的mov %rbp, %rsp部分,因此pop %rbp更快。如果gcc需要一个帧指针并且它必须保留一些额外的堆栈空间,它仍将使用leave(具有大多数调整选项)。