Bagikan melalui


Arsitektur x64

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.