2012-10-21 8 views
6

Ecco un piccolo file sorgente in D:Perché main() compilato da D ha un valore di ritorno a 32 bit su una macchina a 64 bit?

void main() 
{ 
} 

e qui lo smontaggio di objdump del file .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 

Il compilatore è DMD64 D Compiler v2.056 in esecuzione su un Linux x86_64 macchina.

Quello che mi chiedo è perché solo l'EAX a 32 bit viene eliminato piuttosto che l'intero RAX a 64 bit? Presumo che questo sia un valore di ritorno, richiesto proprio come in un programma C anche se non riconosciuto in D source.

+0

Questo non sembra un codice ottimizzato. Non proverei a ragionare sul codice non ottimizzato perché molte cose in esso sono completamente ridondanti ed evitabili come tutte le istruzioni precedenti eccetto 'retq'. –

risposta

16
xor %eax,%eax 

CANCELLA l'intero rax in x64. L'operazione sui registri di dimensioni dword cancella automaticamente l'alta dword del registro completo.

+0

No, non è corretto. Sono estesi a zero. Un 'mov eax, -1' per esempio rende' rax' contiene 'ffffffff'. 'mov ecx, 0FFFFFFFFh'' mov rax, 0FFFFFFFFFFFFFFFFFFh '' mov eax, ecx' fa anche questo. –