Bagikan melalui


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.

Lihat juga