Arsitektur x64
Arsitektur x64 adalah ekstensi x86 yang kompatibel dengan versi mundur. Ini menyediakan mode 64-bit baru dan mode 32-bit warisan, yang identik dengan x86.
Istilah "x64" mencakup AMD 64 dan Intel64. Set instruksi hampir identik.
Register
x64 memperluas 8 register tujuan umum x86 menjadi 64-bit, dan menambahkan 8 register 64-bit baru. Register 64-bit memiliki nama yang dimulai dengan "r". Misalnya, ekstensi eax 64-bit disebut rax. Register baru diberi nama r8 hingga r15.
32 bit yang lebih rendah, 16 bit, dan 8 bit dari setiap register dapat diatasi secara langsung dalam operand. Ini termasuk register, seperti esi, yang 8 bit yang lebih rendah sebelumnya tidak dapat diatasi. Tabel berikut menentukan nama bahasa rakitan untuk bagian bawah register 64-bit.
Register 64-bit | 32 bit lebih rendah | 16 bit lebih rendah | 8 bit 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 subregister 32-bit secara otomatis tidak diperluas ke seluruh register 64-bit. Operasi yang menghasilkan subregister 8-bit atau 16-bit tidak diperluas nol (ini kompatibel dengan perilaku x86).
8 bit tinggi ax, bx, cx, dan dx masih dapat diatasi sebagai ah, bh, ch, dh tetapi tidak dapat digunakan dengan semua jenis operand.
Eip pointer instruksi dan register bendera telah diperpanjang menjadi 64 bit (rip dan rflags, masing-masing).
Prosesor x64 juga menyediakan beberapa set register floating-point:
Delapan register x87 80-bit.
Delapan register MMX 64-bit. (Register ini tumpang tindih dengan register x87.)
Set asli delapan register SSE 128-bit ditingkatkan menjadi enam belas.
Konvensi Panggilan
Tidak seperti 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 argumen yang diteruskan dalam register. Fungsi yang dipanggil dapat menggunakan ruang ini untuk meluapkan isi register ke tumpukan.
Argumen tambahan apa pun diteruskan pada tumpukan.
Nilai pengembalian bilangan bulat atau pointer dikembalikan dalam register rax , sementara nilai pengembalian floating-point dikembalikan dalam xmm0.
rak, rcx, rdx, r8-r11 mudah menguap.
rbx, rbp, rdi, rsi, r12-r15 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.
Mode Alamat
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 telah ditambahkan 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 satu alamat konstanta dikodekan sebagai offset dari rip. Misalnya, instruksi mov rax, [addr] memindahkan 8 byte yang dimulai pada rip addr + ke rak.
Instruksi, seperti jmp, panggilan, dorong, dan pop, yang secara implisit merujuk ke penunjuk instruksi dan penunjuk tumpukan memperlakukannya sebagai register 64 bit pada x64.