2012-10-21 30 views
6

這裏是d一個非常小的源文件:爲什麼D編譯的main()在64位機器上有一個32位的返回值?

void main() 
{ 
} 

這裏的.o文件將objdump的的的拆卸:

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 

編譯器DMD64 d編譯器v2.056上的x86_64的Linux上運行機。

我想知道爲什麼只有32位EAX被清除而不是整個64位RAX?我認爲這是一個返回值,就像在C程序中一樣,即使沒有在D源中確認也是如此。

+0

這看起來不像優化的代碼。我不會嘗試推理未優化的代碼,因爲其中的許多內容都是完全冗餘的,並且可以像上面的所有指令一樣避免,除了'retq'。 –

回答

16
xor %eax,%eax 

是否清除x64中的整個rax。對雙字大小寄存器的操作會自動清除全寄存器的高字節。

+0

不,這是不正確的。它們被零擴展。例如'mov eax,-1'使'rax'包含'ffffffff'。 'mov ecx,0FFFFFFFFh''mov rax,0FFFFFFFFFFFFFFFFh''mov eax,ecx'也是。 –

相關問題