Dalam Tour Manual Intel x86-64 , saya membaca
Mungkin fakta yang paling mengejutkan adalah bahwa instruksi seperti
MOV EAX, EBX
secara otomatis nol di atas 32 bitRAX
register.
Dokumentasi Intel (3.4.1.1 Register Tujuan Umum dalam Mode 64-Bit dalam Arsitektur Dasar manual) yang dikutip dari sumber yang sama memberi tahu kita:
- Operand 64-bit menghasilkan hasil 64-bit di register tujuan umum.
- Operand 32-bit menghasilkan hasil 32-bit, hasil perluasan nol ke 64-bit dalam register tujuan umum tujuan.
- Operand 8-bit dan 16-bit menghasilkan hasil 8-bit atau 16-bit. 56 bit atas atau 48 bit (masing-masing) dari register tujuan umum tujuan tidak dimodifikasi oleh operasi. Jika hasil dari operasi 8-bit atau 16-bit dimaksudkan untuk kalkulasi alamat 64-bit, secara eksplisit tandatangani-perpanjang register ke 64-bit penuh.
Dalam perakitan x86-32 dan x86-64, instruksi 16 bit seperti
mov ax, bx
jangan perlihatkan perilaku "aneh" seperti ini yang kata atas eax di nol.
Jadi: apa alasan mengapa perilaku ini diperkenalkan? Sekilas sepertinya tidak masuk akal (tetapi alasannya mungkin karena saya terbiasa dengan kebiasaan perakitan x86-32).
r32
operan tujuan nol 32 tinggi, bukan penggabungan. Misalnya, beberapa assembler akan mengganti pmovmskb r64, xmm
dengan pmovmskb r32, xmm
, menyimpan REX, karena versi tujuan 64-bit berperilaku sama. Meskipun bagian Operasi dari manual mencantumkan semua 6 kombinasi dest 32 / 64bit dan sumber 64/128 / 256b secara terpisah, ekstensi nol implisit dari formulir r32 menduplikasi ekstensi nol eksplisit dari formulir r64. Saya ingin tahu tentang implementasi HW ...
xor eax,eax
atau xor r8d,r8d
cara terbaik untuk nol RAX atau R8 (menyimpan awalan REX untuk RAX, dan 64-bit XOR bahkan tidak ditangani secara khusus di Silvermont). Terkait: Bagaimana sebenarnya kinerja sebagian register pada Haswell / Skylake? Menulis AL tampaknya memiliki ketergantungan yang salah pada RAX, dan AH tidak konsisten