Trong Chuyến tham quan hướng dẫn sử dụng Intel x86-64 , tôi đã đọc
Có lẽ sự thật đáng ngạc nhiên nhất là một lệnh chẳng hạn như
MOV EAX, EBX
tự động lấy 32 bit trên củaRAX
thanh ghi.
Tài liệu Intel (3.4.1.1 Thanh ghi Mục đích Chung ở Chế độ 64-Bit trong Kiến trúc Cơ bản thủ công) được trích dẫn tại cùng một nguồn cho chúng ta biết:
- Toán hạng 64 bit tạo ra kết quả 64 bit trong thanh ghi mục đích chung đích.
- Toán hạng 32 bit tạo ra kết quả 32 bit, không được mở rộng thành kết quả 64 bit trong thanh ghi mục đích chung đích.
- Toán hạng 8 bit và 16 bit tạo ra kết quả 8 bit hoặc 16 bit. 56 bit trên hoặc 48 bit (tương ứng) của thanh ghi mục đích chung không bị sửa đổi bởi hoạt động. Nếu kết quả của phép toán 8-bit hoặc 16-bit nhằm mục đích tính toán địa chỉ 64-bit, hãy ký-mở rộng thanh ghi một cách rõ ràng đến 64-bit đầy đủ.
Trong hợp ngữ x86-32 và x86-64, các lệnh 16 bit như
mov ax, bx
không hiển thị loại hành vi "kỳ lạ" này mà từ trên của eax là số 0.
Như vậy: lý do tại sao hành vi này được đưa ra? Thoạt nhìn nó có vẻ phi logic (nhưng lý do có thể là do tôi đã quen với những điều kỳ quặc của hội x86-32).
r32
toán hạng đích bằng không giá trị cao 32, thay vì hợp nhất. Ví dụ: một số trình lắp ráp sẽ thay thế pmovmskb r64, xmm
bằng pmovmskb r32, xmm
, lưu REX, vì phiên bản đích 64 bit hoạt động giống hệt nhau. Mặc dù phần Hoạt động của sổ tay liệt kê tất cả 6 tổ hợp của nguồn đích 32 / 64bit và nguồn 64/128 / 256b riêng biệt, phần mở rộng bằng không ngầm định của biểu mẫu r32 sao chép phần mở rộng bằng 0 rõ ràng của biểu mẫu r64. Tôi tò mò về việc triển khai HW ...
xor eax,eax
hoặc xor r8d,r8d
là cách tốt nhất để không RAX hoặc R8 (lưu tiền tố REX cho RAX và XOR 64-bit thậm chí không được xử lý đặc biệt trên Silvermont). Liên quan: Chính xác thì thanh ghi từng phần trên Haswell / Skylake hoạt động như thế nào? Viết AL dường như có một sự phụ thuộc sai trên rax, và AH là không phù hợp