Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
X64-arkitekturen är ett bakåtkompatibelt tillägg av x86. Det ger ett nytt 64-bitarsläge och ett äldre 32-bitarsläge, som är identiskt med x86.
Termen "x64" innehåller både AMD 64 och Intel64. Instruktionsuppsättningarna är nästan identiska.
Register
x64 utökar x86:s 8 allmänna register till 64-bitars och lägger till 8 nya 64-bitarsregister. 64-bitarsregistren har namn som börjar med "r". Till exempel kallas 64-bitarstillägget av eax för rax. De nya registren heter r8 till r15.
De lägre 32 bitarna, 16 bitar och 8 bitar av varje register kan adresseras direkt i operander. Detta inkluderar register, till exempel esi, vars lägre 8 bitar inte tidigare var adresserbara. I följande tabell anges sammansättningsspråknamnen för de lägre delarna av 64-bitarsregister.
| 64-bitarsregister | Lägre 32 bitar | Lägre 16 bitar | Lägre 8 bitar |
|---|---|---|---|
| rax | eax | yxa | al |
| rbx | ebx | Bx | Bl |
| rcx | ecx | cx | cl |
| Rdx | edx | dx | deciliter |
| rsi | Esi | Si | Sil |
| rdi | Edi | di | Dil |
| rbp | ebp | Bp | bpl |
| rsp | Esp | 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 |
Operationer som skriver ut till ett 32-bitars underregister nollfylls automatiskt till ett helt 64-bitarsregister. Åtgärder som matar ut till 8-bitars eller 16-bitars underregister är inte nollutsträckta (det här är kompatibelt x86-beteende).
De höga 8 bitarna av ax, bx, cx och dx är fortfarande adresserbara som ah, bh, ch, dh men kan inte användas med alla typer av operander.
Instruktionspekarens eip - och flaggregister har utökats till 64 bitar (rip respektive rflags).
X64-processorn innehåller också flera uppsättningar flyttalsregister:
Åtta 80-bitars x87-register.
Åtta 64-bitars MMX-register. (Dessa register överlappar x87-registren.)
Den ursprungliga uppsättningen med åtta 128-bitars SSE-register utökas till sexton.
Samtalskonventioner
Till skillnad från x86 stöder C/C++-kompilatorn bara en anropskonvention på x64. Den här anropskonventionen utnyttjar det ökade antalet tillgängliga register på x64:
De första fyra heltals- eller pekarparametrarna skickas i registeren rcx, rdx, r8 och r9 .
De första fyra flyttalsparametrarna skickas i de fyra första SSE-register, xmm0-xmm3.
Anroparen reserverar utrymme på stacken för argument som skickas i register. Den anropade funktionen kan använda det här utrymmet för att spilla innehållet i register till stacken.
Eventuella ytterligare argument skickas på stacken.
Ett heltals- eller pekarreturvärde returneras i rax-registret , medan ett flyttalsreturvärde returneras i xmm0.
rax, rcx, rdx, r8-r11 är flyktiga.
rbx, rbp, rdi, rsi, r12-r15 är icke-volatila.
Anropskonventionen för C++ är liknande. Den this-pekaren skickas som en implicit första parameter. De följande tre parametrarna skickas i återstående register, medan resten skickas på stacken.
Adresslägen
Adresslägena i 64-bitarsläge är liknande men inte identiska med x86.
Instruktioner som refererar till 64-bitarsregister utförs automatiskt med 64-bitars precision. Till exempel flyttar mov rax, [rbx] 8 byte från rbx till rax.
En särskild form av mov-instruktionen har lagts till för 64-bitars omedelbara konstanter eller konstanta adresser. För alla andra instruktioner är omedelbara konstanter eller konstanta adresser fortfarande 32 bitar.
x64 tillhandahåller ett nytt rip-relative-adresseringsläge. Instruktioner som refererar till en enda konstant adress kodas som förskjutningar från rip. Instruktionen mov rax, [addr] flyttar till exempel 8 byte från och med addr + rip till rax.
Instruktioner, till exempel jmp, anrop, push och pop, som implicit refererar till instruktionspekaren och stackpekaren behandlar dem som 64 bitars register på x64.