Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 r8 až r15.
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.