Dela via


x64-arkitektur

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.

Se även