Từ x86-64 Tour of Intel Manuals, tôi đọcTại sao lệnh x86-64 trên thanh ghi 32 bit không phải phần trên của thanh ghi 64 bit đầy đủ?
lẽ một thực tế đáng ngạc nhiên nhất là một lệnh như
MOV EAX, EBX
tự động zero trên 32 bit củaRAX
đăng ký.
Các tài liệu Intel (3.4.1.1 chung-Purpose Thanh ghi ở chế độ 64-Bit trong sổ tay cơ bản Kiến trúc) niêm yết ở cùng một nguồn cho chúng ta biết:
- 64-bit toán hạng tạo ra một 64 -bit kết quả trong thanh ghi đích đích chung.
- Toán hạng 32 bit tạo ra kết quả 32 bit, không được mở rộng đến kết quả 64 bit trong thanh ghi đích đích chung.
- 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 đích đích không được sửa đổi bởi thao tác. Nếu kết quả của thao tác 8 bit hoặc 16 bit được dùng để tính toán địa chỉ 64 bit, hãy mở rộng đăng ký một cách rõ ràng đến 64 bit đầy đủ.
Trong x86-32 và lắp ráp x86-64, 16 hướng dẫn chút như
mov ax, bx
không hiển thị loại hành vi "kỳ lạ" rằng từ trên của eax được zeroed.
Do đó: lý do khiến hành vi này được giới thiệu là gì? Ngay từ cái nhìn đầu tiên, nó có vẻ phi lý (nhưng lý do có thể là tôi quen với những điều kỳ quặc của x86-32 assembly).
Nếu bạn sử dụng Google cho "Quầy đăng ký một phần", bạn sẽ tìm thấy khá nhiều thông tin về sự cố mà họ (hầu như chắc chắn) đang cố tránh. –
http://stackoverflow.com/questions/25455447/x86-64-registers-rax-eax-ax-al-overwriting-full-register-contents –
Không chỉ "hầu hết".Các lệnh AFAIK, * all * có toán hạng đích 'r32' bằng 0, cao hơn là hợp nhất. Ví dụ, một số assembly sẽ thay thế 'pmovmskb r64, xmm' bằng' pmovmskb r32, xmm', lưu một REX, vì phiên bản đích 64bit hoạt động giống nhau. Mặc dù [Phần hoạt động của sách hướng dẫn] (http://www.felixcloutier.com/x86/PMOVMSKB.html) liệt kê tất cả 6 kết hợp của nguồn 32/64bit đích và 64/128/256b riêng biệt, phần mở rộng bằng 0 của mẫu r32 sao chép phần mở rộng không rõ ràng của dạng r64. Tôi tò mò về việc thực hiện HW ... –