我正在为简单的程序生成汇编,以便更好地理解,我看到了一条我不理解的指令。
下面是我使用的一个简单程序:int main() {
int i = 1;
int j = 2;
int k = i + j;
return 0;
}
生成clang main.c -o main.asm -S -O0
,我得到这个为我的主:
main:
.cfi_startproc
# %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
xorl %eax, %eax
movl $0, -4(%rbp)
movl $1, -8(%rbp)
movl $2, -12(%rbp)
movl -8(%rbp), %ecx
addl -12(%rbp), %ecx
movl %ecx, -16(%rbp)
popq %rbp
.cfi_def_cfa %rsp, 8
retq
我得到的大部分,除了movl $0, -4(%rsp)
,它正好在两个变量初始化之前。使用-g
编译或使用其他方式添加注释并不提供任何线索,这是在做什么。
更让我困惑的是,使用GCC的相同选项生成的程序集没有显示此指令,而其余的程序集显然是相同的。
我在本文中特别记录了自己,这表明在%rbp-4
中应该有"局部变量1";这似乎不是这里的情况。
这是在做什么,我错过了什么?
这里唯一真正的代码是
main: # @main
xorl %eax, %eax
retq
或者如果你想强制堆栈帧:
main: # @main
pushq %rbp
movq %rsp, %rbp
xorl %eax, %eax
popq %rbp
retq
如果你的程序没有可观察到的行为
剩下的是因为你没有优化代码。