6

这是 D 中的一个非常小的源文件:

void main()
{
}

这里是 objdump 对 .o 文件的反汇编:

Disassembly of section .text._Dmain:
0000000000000000 <_Dmain>:
void main()
   0:   55                      push   %rbp
   1:   48 8b ec                mov    %rsp,%rbp
   4:   31 c0                   xor    %eax,%eax
{
   6:   5d                      pop    %rbp
   7:   c3                      retq   

编译器是在 x86_64 Linux 机器上运行的 DMD64 D Compiler v2.056。

我想知道为什么只清除 32 位 EAX 而不是整个 64 位 RAX?我假设这是一个返回值,就像在 C 程序中一样,即使在 D 源代码中没有确认也是如此。

4

1 回答 1

16
xor    %eax,%eax

确实清除了raxx64 中的全部内容。对双字大小寄存器的操作会自动清除整个寄存器的高双字。

于 2012-10-21T03:57:34.070 回答