Architektura x64

Architektura x64 je zpětně kompatibilní rozšíření x86, které poskytuje nový 64bitový režim a starší 32bitový režim identický s x86. Tato architektura rozšiřuje osm registrů pro obecné účely x86 na 64bitovou verzi, přidává osm nových registrů a zavádí vylepšené konvence volání a režimy adresování pro moderní 64bitové programování.

Pojem "x64" zahrnuje AMD64 i Intel 64. Sady instrukcí jsou téměř identické.

Registruje

x64 rozšiřuje osm registrů x86 pro obecné účely na 64bitovou verzi a přidává osm nových 64bitových registrů. 64bitové registry mají názvy začínající na "r". Například 64bitové rozšíření eaxu se nazývá rax. Nové registry mají název r8r15.

32bitové, 16bitové a 8bitové části každého registru lze přímo adresovat v operandech. Tato přímá adresovatelnost zahrnuje registry, jako je esi, jejichž nižších 8 bitů nebylo dříve adresovatelné. Následující tabulka určuje názvy jazyků sestavení pro dolní části 64bitových registrů.

64bitový registr Nižší 32 bitů Nižších 16 bitů Dolní 8 bitůfix
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 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

Operace, které se vypisují do 32bitového podregistru, se automaticky rozšíří o celý 64bitový registr. Operace, které zapisují do 8bitových nebo 16bitových subregistrů, se nerozšiřují nulou (toto chování je kompatibilní s x86).

Vysoké 8 bitů ax, bx, cx a dx jsou stále adresovatelné jako ah, bh, ch a dh, ale nelze je použít se všemi typy operandů.

Registr eip a registr flags jsou rozšířeny na 64 bitů (rip a rflags, v uvedeném pořadí).

Procesor x64 také poskytuje několik sad registrů pro plovoucí desetinná čísla:

  • Osm 80bitových registrů x87.

  • Osm 64bitových registrů MMX. (Tyto registry se překrývají s registry x87.)

  • Původní sada osmi 128bitových registrů SSE se zvýší na 16.

Konvence volání

Na rozdíl od architektury x86 kompilátor C/C++ podporuje pouze jednu konvenci volání na platformě x64. Tato konvence volání využívá zvýšený počet registrů dostupných na platformě x64:

  • První čtyři celočíselné parametry nebo parametry ukazatele se předávají v registrech rcx, rdx, r8 a r9 .

  • První čtyři parametry s plovoucí desetinnou čárkou se předávají v prvních čtyřech registrech SSE xmm0-xmm3.

  • Volající si v zásobníku rezervuje místo pro argumenty předané v registrech. Volaná funkce může použít tento prostor k uložení obsahu registrů do zásobníku.

  • Předáte všechny ostatní argumenty v zásobníku.

  • V registru rax se vrátí celočíselná hodnota nebo návratová hodnota ukazatele, zatímco návratová hodnota s plovoucí desetinnou čárkou se vrátí v xmm0.

  • rax, rcx, rdx, r8-r11 jsou nestálé.

  • rbx, rbp, rdi, rsi, r12-r15 jsou nevolatilní.

Konvence volání pro C++ je podobná. Tento ukazatel se předává jako implicitní první parametr. Další tři parametry jsou předány v ostatních registrech, zatímco zbytek je předán do zásobníku.

Režimy adresování

Režimy adresování v 64bitovém režimu jsou podobné, ale nejsou identické s x86.

  • Pokyny, které odkazují na 64bitové registry, se automaticky provádějí s 64bitovou přesností. Například mov rax, [rbx] přesune 8 bajtů počínaje rbx do rax.

  • Speciální forma instrukce mov existuje pro 64bitové okamžité konstanty nebo konstantní adresy. U všech ostatních instrukcí jsou okamžité konstanty nebo konstantní adresy stále 32 bitů.

  • x64 poskytuje nový rip-relativní režim adresování. Instrukce, které se vztahují k jedné konstantní adrese, se kódují jako ofsety od rip. Například instrukce mov rax, [addr] přesune 8 bajtů od addr + rip na rax.

Instrukce, jako je jmp, call, push a pop, které implicitně odkazují na instrukční ukazatel a ukazatel zásobníku, je na x64 platformě považují za 64bitové registry.