Я компилирую эту программу на 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
нужен для? Мне кажется бесполезным перемещать что-то в стеке и сразу же после этого выталкивать.