ในx86-64 Tour of Intel Manualsฉันอ่าน
บางทีความจริงที่น่าประหลาดใจที่สุดก็คือคำสั่งเช่น
MOV EAX, EBX
การRAX
ลงทะเบียน32 บิตบนเป็นศูนย์โดยอัตโนมัติ
เอกสารของ Intel (3.4.1.1 General-Purpose Registers ในโหมด 64 บิตในสถาปัตยกรรมพื้นฐานแบบแมนนวล) ที่อ้างถึงในแหล่งข้อมูลเดียวกันบอกเราว่า:
- ตัวถูกดำเนินการ 64 บิตสร้างผลลัพธ์ 64 บิตในการลงทะเบียนวัตถุประสงค์ทั่วไปปลายทาง
- ตัวถูกดำเนินการ 32 บิตสร้างผลลัพธ์ 32 บิตขยายศูนย์เป็นผลลัพธ์ 64 บิตในการลงทะเบียนวัตถุประสงค์ทั่วไปปลายทาง
- ตัวถูกดำเนินการ 8 บิตและ 16 บิตสร้างผลลัพธ์ 8 บิตหรือ 16 บิต 56 บิตด้านบนหรือ 48 บิต (ตามลำดับ) ของรีจิสเตอร์วัตถุประสงค์ทั่วไปปลายทางจะไม่ถูกแก้ไขโดยการดำเนินการ หากผลลัพธ์ของการดำเนินการ 8 บิตหรือ 16 บิตมีไว้สำหรับการคำนวณแอดเดรส 64 บิตให้ลงชื่อ - ขยายรีจิสเตอร์เป็น 64 บิตเต็ม
ในการประกอบ x86-32 และ x86-64 คำแนะนำ 16 บิตเช่น
mov ax, bx
อย่าแสดงพฤติกรรม "แปลก ๆ " แบบนี้ว่าคำบนของ eax เป็นศูนย์
ดังนั้น: อะไรคือสาเหตุที่ทำให้เกิดพฤติกรรมนี้? เมื่อมองแวบแรกดูเหมือนจะไร้เหตุผล (แต่เหตุผลอาจเป็นเพราะฉันคุ้นเคยกับการประกอบ x86-32)
r32
ตัวถูกดำเนินการปลายทางเป็นศูนย์ที่ 32 สูงแทนที่จะรวม ตัวอย่างเช่นแอสเซมเบลอร์บางตัวจะแทนที่pmovmskb r64, xmm
ด้วยpmovmskb r32, xmm
การบันทึก REX เนื่องจากเวอร์ชันปลายทาง 64 บิตทำงานเหมือนกัน แม้ว่าส่วนการทำงานของคู่มือจะแสดงรายการชุดค่าผสมทั้งหมด 6 ชุดของแหล่งที่มา 32/64 บิตและ 64/128 / 256b แยกกัน แต่ส่วนขยายศูนย์โดยนัยของแบบฟอร์ม r32 จะซ้ำกับส่วนขยายศูนย์ที่ชัดเจนของฟอร์ม r64 ฉันอยากรู้เกี่ยวกับการใช้งาน HW ...
xor eax,eax
หรือxor r8d,r8d
เป็นวิธีที่ดีที่สุดในการเป็นศูนย์ RAX หรือ R8 (การบันทึกคำนำหน้า REX สำหรับ RAX และ XOR 64 บิตไม่ได้รับการจัดการเป็นพิเศษใน Silvermont) ที่เกี่ยวข้อง: การลงทะเบียนบางส่วนบน Haswell / Skylake ทำงานอย่างไร การเขียน AL ดูเหมือนจะมีการพึ่งพา RAX ที่ผิดพลาดและ AH ไม่สอดคล้องกัน