以下是需要翻译的内容:
在下面的C代码中:
#include <stdio.h>
int main(void){getchar();}
它生成以下汇编代码:
main:
push rbp
mov rbp, rsp
# no extra instruction here when header is included
call getchar
mov eax, 0
pop rbp
ret
然而,如果我在文件中不包含stdio.h
,那么它仍然可以编译,但会添加一个看起来像是随机的mov eax, 0
指令:
这里是Compiler Explorer:https://godbolt.org/z/3fTcss。这只是"未定义行为"的一部分,还是在call getchar
之前添加该指令有特殊原因?
al
清零。 - Jesteral
只是表示使用的向量寄存器数量,最多为8个(xmm0-xmm7)。其余的参数放在堆栈上。 - Jesterxor
来清除eax
。 - Simon Richter-O2
及以上优化级别下会有影响。在此之中插入一个零的mov
指令只是未经优化、明显且接近C语言版本的代码。 - TooTea