In Intel Kılavuzları X86-64 Tour , okuduğum
Belki de en şaşırtıcı gerçek, gibi bir komutun
MOV EAX, EBX
otomatik olarak üst 32 bitlikRAX
yazmacı sıfırlamasıdır .
Aynı kaynakta alıntılanan Intel belgeleri (3.4.1.1 Kılavuz Temel Mimaride 64-Bit Modunda Genel Amaçlı Kayıtlar) bize şunları söyler:
- 64 bitlik işlenenler, hedef genel amaçlı kayıtta 64 bitlik bir sonuç oluşturur.
- 32 bitlik işlenenler, hedef genel amaçlı kayıtta 64 bitlik bir sonuca sıfır genişletilmiş 32 bitlik bir sonuç üretir.
- 8 bit ve 16 bit işlenenler, 8 bitlik veya 16 bitlik bir sonuç oluşturur. Hedef genel amaçlı yazmacın üst 56 biti veya 48 biti (sırasıyla) işlem tarafından değiştirilmez. 8 bitlik veya 16 bitlik bir işlemin sonucu 64 bit adres hesaplaması için tasarlandıysa, kaydı açıkça işaretleyerek tam 64 bit'e genişletin.
X86-32 ve x86-64 derlemesinde, aşağıdaki gibi 16 bit talimatlar
mov ax, bx
eax'ın üst kelimesinin sıfırlandığı bu tür "garip" davranışı göstermeyin.
Öyleyse: bu davranışın ortaya çıkmasının nedeni nedir? İlk bakışta mantıksız görünüyor (ancak nedeni x86-32 montajının tuhaflıklarına alışmış olmam olabilir).
r32
birleştirmek yerine yüksek 32'yi sıfırlar. Örneğin, bazı montajcı yerini alacak pmovmskb r64, xmm
olan pmovmskb r32, xmm
64bit hedef versiyonu aynı şekilde davranır, çünkü bir REX tasarruf. Olsa manuel çalıştırılması bölüm 32 dest / 64bit ve 64/128 / 256B kaynağının 6 kombinasyonları ayrı ayrı listeler, r32 formunun örtük sıfır uzatma R64 formunun açık sıfır uzantısı çoğaltır. HW uygulamasını merak ediyorum ...
xor eax,eax
veya xor r8d,r8d
RAX veya R8'i sıfırlamanın en iyi yoludur (RAX için bir REX öneki ve 64-bit XOR kaydetmek Silvermont'ta özel olarak ele alınmaz). İlgili: Haswell / Skylake'deki kısmi kayıtlar tam olarak nasıl performans gösteriyor? AL'yi yazmak RAX'e yanlış bir bağımlılığa sahip gibi görünüyor ve AH tutarsız