我正在编译此C程序并比较生成的汇编代码:

int main(){ return 0; }

GCC提供此主要功能(cc hello.c -S):
_main:
LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    $0, %eax
    leave
    ret

LLVM提供此主要功能(clang hello.c -S):
_main:
Leh_func_begin0:
    pushq   %rbp
Ltmp0:
    movq    %rsp, %rbp
Ltmp1:
    movl    $0, %eax
    movl    $0, -4(%rbp)
    popq    %rbp
    ret
Leh_func_end0:

所需的movl $0, -4(%rbp)popq %rbp是什么?在我看来,将某些东西移到堆栈上然后直接将其弹出是没有用的。

最佳答案

实际上,它们是可比的。离开是一个高级指令:

从英特尔手册:

16-bit: C9 LEAVE A Valid Valid Set SP to BP, then pop BP.
32-bit: C9 LEAVE A N.E. Valid Set ESP to EBP, then pop EBP.
64-bit: C9 LEAVE A Valid N.E. Set RSP to RBP, then pop RBP.

基本上,休假等于
movq %rbp, %rsp
popq %rbp

关于c - LLVM为什么要为同一程序添加两条额外的指令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4903912/

10-11 21:12