Architettura x64
L'architettura x64 è un'estensione compatibile con le versioni precedenti di x86. Fornisce una nuova modalità a 64 bit e una modalità legacy a 32 bit, identica a x86.
Il termine "x64" include sia AMD 64 che Intel64. I set di istruzioni sono quasi identici.
Registri
x64 estende i registri per utilizzo generico x86 da 64 bit e aggiunge 8 nuovi registri a 64 bit. I registri a 64 bit hanno nomi che iniziano con "r". Ad esempio, l'estensione a 64 bit di eax è denominatarax. I nuovi registri sono denominati r8 a r15.
I 32 bit inferiori, 16 bit e 8 bit di ogni registro sono direttamente indirizzabili negli operandi. Sono inclusi i registri, ad esempio esi, i cui 8 bit inferiori non erano indirizzabili in precedenza. Nella tabella seguente vengono specificati i nomi del linguaggio di assembly per le parti inferiori dei registri a 64 bit.
Registrazione a 64 bit | Bit inferiori a 32 bit | Bit inferiori a 16 bit | Più basso di 8 bit |
---|---|---|---|
Rax | Eax | Ax | al |
Rbx | Ebx | Bx | bl |
rcx | ecx | Cx | cl |
rdx | Edx | Dx | Dl |
Rsi | Esi | si | Sil |
Rdi | Edi | di | Dil |
Rbp | Ebp | bp | bpl |
Rsp | Spagnolo | sp | Spl |
r8 | r8d | r8w | r8b |
r9 | r9d | r9w | r9b |
r10 | r10d | r10w | r10b |
r11 | r11d | r11w | r11b |
r12 | r12d | r12w | r12b |
r13 | r13d | r13w | r13b |
r14 | r14d | r14w | r14b |
r15 | r15d | r15w | r15b |
Le operazioni che eseguono l'output in una sottoregola a 32 bit vengono estese automaticamente all'intero registro a 64 bit. Le operazioni che generano l'output in sottogisteri a 8 bit o a 16 bit non sono estese a zero (questo è il comportamento x86 compatibile).
I 8 bit elevati di ax, bx, cx e dx sono ancora indirizzabili come ah, bh, ch, dh, ma non possono essere usati con tutti i tipi di operandi.
Il puntatore alle istruzioni eip e i flag sono stati estesi rispettivamente a 64 bit (rip e rflag).
Il processore x64 offre anche diversi set di registri a virgola mobile:
Otto registri x80 bit x87.
Otto registri MMX a 64 bit. Questi registri si sovrappongono ai registri x87.
Il set originale di otto registri SSE a 128 bit è aumentato a sedici.
Convenzioni di chiamata
A differenza del compilatore X86, il compilatore C/C++ supporta solo una convenzione di chiamata su x64. Questa convenzione di chiamata sfrutta il numero maggiore di registri disponibili in x64:
I primi quattro parametri integer o puntatore vengono passati nei registri rcx, rdx, r8 e r9 .
I primi quattro parametri a virgola mobile vengono passati nei primi quattro registri SSE, xmm0-xmm3.
Il chiamante riserva spazio nello stack per gli argomenti passati nei registri. La funzione denominata può usare questo spazio per sversare il contenuto dei registri nello stack.
Tutti gli argomenti aggiuntivi vengono passati allo stack.
Un valore restituito integer o puntatore viene restituito nel registro rax , mentre viene restituito un valore restituito a virgola mobile in xmm0.
rax, rcx, rdx, r8-r11 sono volatili.
rbx, rbp, rdi, rsi, r12-r15 sono nonvolatile.
La convenzione chiamante per C++ è simile. Questo puntatore viene passato come primo parametro implicito. I tre parametri successivi vengono passati nei registri rimanenti, mentre il resto viene passato nello stack.
Modalità di indirizzamento
Le modalità di indirizzamento in modalità a 64 bit sono simili ma non identiche a x86.
Le istruzioni che fanno riferimento ai registri a 64 bit vengono eseguite automaticamente con precisione a 64 bit. Ad esempio , mov rax, [rbx] sposta 8 byte a partire da rbx in rax.
Una forma speciale dell'istruzione mov è stata aggiunta per costanti immediate a 64 bit o indirizzi costanti. Per tutte le altre istruzioni, costanti immediate o indirizzi costanti sono ancora 32 bit.
X64 offre una nuova modalità di indirizzamento relativo al rip. Le istruzioni che fanno riferimento a un singolo indirizzo costante vengono codificate come offset dal rip. Ad esempio, l'istruzione mov rax, [addr] sposta 8 byte a partire da addr + rip to rax.
Istruzioni, ad esempio jmp, chiamata, push e pop, che fanno implicitamente riferimento al puntatore alle istruzioni e al puntatore dello stack considerarli come registri a 64 bit in x64.