Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Arsitektur x64 adalah ekstensi x86 yang kompatibel dengan versi sebelumnya dan menyediakan mode 64-bit baru serta mode 32-bit lama yang identik dengan x86. Arsitektur ini memperluas delapan register tujuan umum x86 ke 64-bit, menambahkan delapan register baru, dan memperkenalkan konvensi panggilan dan mode alamat yang ditingkatkan untuk pemrograman 64-bit modern.
Istilah "x64" mencakup AMD64 dan Intel 64. Set instruksi hampir identik.
Register
x64 memperluas delapan register tujuan umum x86 menjadi 64-bit dan menambahkan delapan register 64-bit baru. Register 64-bit memiliki nama yang dimulai dengan "r". Misalnya, ekstensi eax 64-bit disebut raks. Register baru diberi nama r8 hingga r15.
32 bit yang lebih rendah, 16 bit, dan 8 bit dari setiap register dapat diatasi langsung dalam operand. Kemampuan pengalamatan langsung ini mencakup register seperti esi, yang 8 bit terendahnya sebelumnya tidak dapat diakses. Tabel berikut menentukan nama bahasa rakitan untuk bagian bawah register 64-bit.
| Register 64-bit | 32 bit lebih rendah | 16 bit lebih rendah | 8 bitsfix lebih rendah |
|---|---|---|---|
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 |
Operasi yang menghasilkan output ke subregister 32-bit secara otomatis akan diperpanjang dengan nol ke seluruh register 64-bit. Operasi yang menghasilkan keluaran ke subregister 8-bit atau 16-bit tidak memperluas dengan nol (perlakuan ini kompatibel dengan x86).
8 bit tinggi ax, bx, cx, dan dx masih dapat diatasi sebagai ah, bh, ch, dan dh tetapi tidak dapat digunakan dengan semua jenis operand.
Pointer instruksi eip dan register flag diperluas hingga 64 bit (rip dan rflags, masing-masing).
Prosesor x64 juga menyediakan beberapa set register floating-point:
Delapan 80-bit x87 mendaftar.
Delapan mmx 64-bit mendaftar. (Register ini tumpang tindih dengan register x87.)
Set asli delapan register SSE 128-bit ditingkatkan menjadi 16.
Konvensi panggilan
Tidak seperti arsitektur x86, pengkompilasi C/C++ hanya mendukung satu konvensi panggilan pada x64. Konvensi panggilan ini memanfaatkan peningkatan jumlah register yang tersedia di x64:
Empat parameter bilangan bulat atau pointer pertama diteruskan dalam register rcx, rdx, r8, dan r9 .
Empat parameter floating-point pertama diteruskan dalam empat register SSE pertama, xmm0-xmm3.
Penelepon mencadangkan ruang pada tumpukan untuk parameter yang dilewatkan melalui register. Fungsi yang dipanggil dapat menggunakan ruang ini untuk membuang isi register ke tumpukan.
Anda meneruskan argumen lain ke tumpukan.
Nilai pengembalian berupa bilangan bulat atau penunjuk dikembalikan dalam register rax, sedangkan nilai pengembalian berupa floating-point dikembalikan dalam xmm0.
rax, rcx, rdx, r8-r11 mudah menguap.
rbx, rbp, rdi, rsi, r12-r15 adalah nonvolatile.
Konvensi panggilan untuk C++ serupa. Pointer ini diteruskan sebagai parameter pertama implisit. Tiga parameter berikutnya diteruskan dalam register yang tersisa, sementara sisanya diteruskan pada tumpukan.
Modus pengalamatan
Mode alamat dalam mode 64-bit serupa tetapi tidak identik dengan x86.
Instruksi yang merujuk ke register 64-bit secara otomatis dilakukan dengan presisi 64-bit. Misalnya, mov rax, [rbx] memindahkan 8 byte yang dimulai dari rbx ke dalam rak.
Bentuk khusus instruksi mov ada untuk konstanta langsung 64-bit atau alamat konstanta. Untuk semua instruksi lainnya, konstanta langsung atau alamat konstanta masih 32 bit.
x64 menyediakan mode alamat rip-relative baru. Instruksi yang merujuk ke alamat konstan tunggal dienkode sebagai offset dari rip. Misalnya, instruksi mov rax, [addr] memindahkan 8 byte yang dimulai pada addr + rip ke rax.
Instruksi, seperti jmp, call, push, dan pop, yang secara implisit merujuk ke pointer instruksi dan pointer tumpukan memperlakukan mereka sebagai register 64-bit pada x64.