私はこのCプログラムをコンパイルし、生成されたアセンブリコードを比較しています:LLVMが同じプログラムに対して2つの追加命令を追加するのはなぜですか?
_main:
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl $0, %eax
leave
ret
LLVMこの主な機能を与える(clang hello.c -S
):
int main(){ return 0; }
GCCと、このメイン関数(cc 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
は何のために必要ですか?スタック上の何かを移動し、後で直接ポップすることは私には役に立たないようです。
オプティマイザを使用せずにコンパイラのアセンブリ出力を比較するのはちょっと不公平です。 –