Di x86-64 Tur Intel Manuals, saya baca
Mungkin yang paling mengejutkan adalah fakta bahwa instruksi seperti
MOV EAX, EBX
secara otomatis nol atas 32 bitRAX
mendaftar.
Intel dokumentasi (3.4.1.1 General-Purpose Register dalam Mode 64-Bit di manual Arsitektur Dasar) yang dikutip pada sumber yang sama mengatakan:
- 64-bit operan yang menghasilkan 64-bit mengakibatkan tujuan umum register tujuan.
- 32-bit operand menghasilkan 32-bit hasilnya, nol-diperpanjang untuk 64-bit mengakibatkan tujuan umum register tujuan.
- 8-bit dan 16-bit operand menghasilkan 8-bit atau 16-bit hasilnya. Atas 56 bit atau 48 bit (masing-masing) tujuan umum register tujuan yang tidak dapat diubah oleh operasi. Jika hasil dari 8-bit atau 16-bit operasi ini dimaksudkan untuk 64-bit alamat perhitungan, secara eksplisit tanda-memperpanjang daftar lengkap 64-bit.
Di x86-32 dan x86-64 majelis, 16 bit instruksi seperti
mov ax, bx
don't acara semacam ini "aneh" perilaku bahwa atas firman eax adalah memusatkan perhatian.
Dengan demikian: apa alasan mengapa perilaku ini diperkenalkan? Pada pandangan pertama tampaknya tidak masuk akal (tapi alasan mungkin bahwa saya digunakan untuk kebiasaan dari x86-32 perakitan).
I'm tidak AMD atau berbicara untuk mereka, tapi aku akan melakukannya dengan cara yang sama. Karena penekanan yang tinggi setengah doesn't menciptakan ketergantungan pada nilai sebelumnya, bahwa CPU harus menunggu. Daftar nama mekanisme dasarnya akan dapat dikalahkan jika itu't dilakukan dengan cara itu.
Dengan cara ini anda dapat menulis kode cepat menggunakan nilai 32-bit dalam mode 64-bit tanpa harus secara eksplisit istirahat dependensi sepanjang waktu. Tanpa perilaku ini, setiap 32-bit instruksi dalam mode 64-bit akan memiliki untuk menunggu sesuatu yang terjadi sebelum, meskipun yang tinggi akan hampir tidak pernah digunakan. (Membuat int
64-bit akan membuang-buang cache jejak dan bandwidth memori; x86-64 yang paling efisien mendukung 32 dan 64-bit operan ukuran)
Perilaku untuk 8 dan 16-bit operand dengan ukuran yang aneh. Ketergantungan madness adalah salah satu alasan bahwa 16-bit instruksi dihindari sekarang. x86-64 mewarisi ini dari 8086 untuk 8-bit dan 386 untuk 16-bit, dan memutuskan untuk memiliki 8 dan 16-bit register bekerja dengan cara yang sama dalam mode 64-bit seperti yang mereka lakukan di mode 32-bit.
Lihat juga https://stackoverflow.com/questions/41573502/why-doesnt-gcc-use-partial-registers untuk rincian praktis dari cara menulis 8 dan 16-bit parsial register (dan selanjutnya membaca penuh register) yang ditangani oleh Cpu.
Itu hanya menghemat ruang di petunjuk, dan instruksi yang ditetapkan. Anda dapat memindahkan kecil langsung nilai-nilai untuk 64-bit register dengan menggunakan yang sudah ada (32-bit) instruksi.
Hal ini juga menghemat anda dari keharusan untuk encode 8 byte nilai-nilai untuk MOV RAX, 42
, ketika MOV EAX, 42
dapat digunakan kembali.
Optimasi ini tidak begitu penting untuk 8 dan 16 bit ops (karena mereka lebih kecil), dan mengubah aturan yang ada juga akan memecahkan kode lama.