C语言 What does mov $0, -4(%rsp) does?



我正在为简单的程序生成汇编,以便更好地理解,我看到了一条我不理解的指令。

下面是我使用的一个简单程序:
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

如果你的程序没有可观察到的行为

剩下的是因为你没有优化代码。

相关内容

最新更新