Condividi tramite


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.

Vedi anche