我为什么得到" popq%rbp"而不是"离开"?

时间:2015-02-04 14:33:30

标签: c assembly

我看不出我做错了什么,这是我的C代码:

main() {
    int i = 0;
    if (i == 0) i++;
    return 0;
}

使用gcc -S test.c进行编译

我期待“离开”而不是“popq%rbp”。

.L2:
movl $0, %eax
popq %rbp
ret

2 个答案:

答案 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手动执行此操作。