2012-10-21 7 views
6

Tutaj jest bardzo mały plik źródłowy w D:Dlaczego metoda main() skompilowana przez D ma 32-bitową wartość zwracaną na komputerze 64-bitowym?

void main() 
{ 
} 

i tutaj demontaż objdump w pliku .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 

Kompilator jest DMD64 D Compiler v2.056 działa na Linux x86_64 maszyna.

Zastanawiam się, dlaczego tylko 32-bitowy EAX jest czyszczony zamiast całego 64-bitowego RAX? Zakładam, że jest to wartość zwracana, wymagana tak jak w programie C, nawet jeśli nie została potwierdzona w źródle D.

+0

To nie wygląda na zoptymalizowany kod. Nie próbowałbym mówić o niezoptymalizowanym kodzie, ponieważ wiele rzeczy w nim zawartych jest całkowicie zbędnych i możliwych do uniknięcia, jak wszystkie powyższe instrukcje z wyjątkiem 'retq'. –

Odpowiedz

16
xor %eax,%eax 

Czyści cały dokument rax w formacie x64. Operacja na rejestrach dwordowych automatycznie usuwa wysoki dword z pełnego rejestru.

+0

Nie, to nie jest poprawne. Są rozszerzone zerowo. Na przykład 'mov eax, -1' sprawia, że' rax' zawiera 'ffffffff'. 'mov ecx, 0FFFFFFFFh'' mov rax, 0FFFFFFFFFFFFFF'' mov eax, ecx' też. –

Powiązane problemy