我看不出我做错了什么,这是我的C代码:
main() {
int i = 0;
if (i == 0) i++;
return 0;
}
使用gcc -S test.c进行编译
我期待“离开”而不是“popq%rbp”。
.L2:
movl $0, %eax
popq %rbp
ret
答案 0 :(得分:1)
我看不出我做错了什么
由GCC决定是否使用ENTER / LEAVE
由于即使INTEL也不赞成使用ENTER / LEAVE,因此GCC不再使用它(难怪)。
此处也不需要movq %rbp,%rsp
,因此您只找到popq %rbp
。
答案 1 :(得分:0)
Intel64和IA-32架构软件开发人员手册说:
LEAVE
指令(不包含任何操作数)会反转先前ENTER
指令的操作。LEAVE
指令将EBP
寄存器的内容复制到ESP
寄存器中,以释放分配给该过程的所有堆栈空间。然后它从堆栈中恢复EBP
寄存器的旧值。这会同时将ESP
寄存器恢复为其原始值。随后的RET
指令可以删除调用程序在堆栈上推送的任何参数和返回地址,以供过程使用。
和gcc手动执行此操作。