Nel tour x86-64 dei manuali Intel , ho letto
Forse il fatto più sorprendente è che un'istruzione come
MOV EAX, EBX
azzera automaticamente i 32 bit diRAX
registro superiori.
La documentazione Intel (3.4.1.1 General-Purpose Registers in 64-Bit Mode in manual Basic Architecture) citata nella stessa fonte ci dice:
- Gli operandi a 64 bit generano un risultato a 64 bit nel registro generico di destinazione.
- Gli operandi a 32 bit generano un risultato a 32 bit, esteso da zero a un risultato a 64 bit nel registro generico di destinazione.
- Gli operandi a 8 e 16 bit generano un risultato a 8 o 16 bit. I 56 bit superiori o 48 bit (rispettivamente) del registro di destinazione generale non vengono modificati dall'operazione. Se il risultato di un'operazione a 8 o 16 bit è destinato al calcolo dell'indirizzo a 64 bit, estendi con segno esplicito il registro a 64 bit completi.
Nell'assembly x86-32 e x86-64, istruzioni a 16 bit come
mov ax, bx
non mostrare questo tipo di comportamento "strano" che la parola superiore di eax sia azzerata.
Quindi: qual è il motivo per cui è stato introdotto questo comportamento? A prima vista sembra illogico (ma il motivo potrebbe essere che sono abituato alle stranezze dell'assembly x86-32).
r32
operando di destinazione zero il 32, piuttosto che unire. Ad esempio, alcuni assemblatori sostituiranno pmovmskb r64, xmm
con pmovmskb r32, xmm
, salvando un REX, perché la versione di destinazione a 64 bit si comporta in modo identico. Anche se la sezione Operazione del manuale elenca separatamente tutte le 6 combinazioni di 32 / 64bit dest e 64/128 / 256b sorgente, l'estensione zero implicita del modulo r32 duplica l'estensione zero esplicita del modulo r64. Sono curioso dell'implementazione HW ...
xor eax,eax
o xor r8d,r8d
è il modo migliore per azzerare RAX o R8 (il salvataggio di un prefisso REX per RAX e XOR a 64 bit non viene nemmeno gestito appositamente su Silvermont). Correlati: come si comportano esattamente i registri parziali su Haswell / Skylake? Scrivere AL sembra avere una falsa dipendenza da RAX e AH è incoerente