इंटेल नियमावली के x86-64 टूर में , मैंने पढ़ा
शायद सबसे आश्चर्यजनक तथ्य यह है कि एक निर्देश जैसे
MOV EAX, EBXस्वचालित रूप सेRAXरजिस्टर के ऊपरी 32 बिट्स को शून्य करता है ।
इंटेल प्रलेखन (3.4.1.1 मैनुअल-बेसिक आर्किटेक्चर में 64-बिट मोड में जनरल-पर्पस रजिस्टर), जो एक ही समय पर उद्धृत होता है:
- 64-बिट ऑपरेंड्स गंतव्य सामान्य-उद्देश्य रजिस्टर में 64-बिट परिणाम उत्पन्न करते हैं।
- 32-बिट ऑपरेंड्स 32-बिट परिणाम उत्पन्न करते हैं, गंतव्य सामान्य-उद्देश्य रजिस्टर में 64-बिट परिणाम के लिए शून्य-विस्तारित।
- 8-बिट और 16-बिट ऑपरेंड 8-बिट या 16-बिट परिणाम उत्पन्न करते हैं। गंतव्य सामान्य प्रयोजन रजिस्टर के ऊपरी 56 बिट्स या 48 बिट्स (क्रमशः) ऑपरेशन द्वारा संशोधित नहीं किए जाते हैं। यदि 8-बिट या 16-बिट ऑपरेशन का परिणाम 64-बिट पता गणना के लिए अभिप्रेत है, तो स्पष्ट रूप से रजिस्टर को पूर्ण 64-बिट्स पर हस्ताक्षरित करें।
X86-32 और x86-64 विधानसभा में, 16 बिट निर्देश जैसे
mov ax, bx
इस तरह के "अजीब" व्यवहार को न दिखाएं कि बाज का ऊपरी शब्द शून्य है।
इस प्रकार: इस व्यवहार को पेश करने का क्या कारण है? पहली नज़र में यह अतार्किक लगता है (लेकिन इसका कारण यह हो सकता है कि मुझे x86-32 असेंबली के प्रश्नपत्रों के लिए इस्तेमाल किया जाता है)।
r32विलय के बजाय उच्च 32 को शून्य करते हैं। उदाहरण के लिए, कुछ कोडर एक REX को बचाने के pmovmskb r64, xmmसाथ बदल देंगे pmovmskb r32, xmm, क्योंकि 64 बिट गंतव्य संस्करण पहचान का व्यवहार करता है। भले ही मैन्युअल के ऑपरेशन खंड में 32/64 बिट के सभी 6 संयोजनों और 64/128 / 256b स्रोत को अलग-अलग सूचीबद्ध किया गया है, लेकिन r32 फॉर्म का अंतर्निहित शून्य-विस्तार r64 फॉर्म के स्पष्ट शून्य-विस्तार को डुप्लिकेट करता है। मैं एचडब्ल्यू कार्यान्वयन के बारे में उत्सुक हूं ...
xor eax,eaxया xor r8d,r8dRAX या R8 को शून्य करने का सबसे अच्छा तरीका है (RAX के लिए REX उपसर्ग को सहेजना, और 64-बिट XOR को विशेष रूप से सिल्वरमोंट पर भी नियंत्रित नहीं किया गया है)। संबंधित: हसवेल / स्काईलेक पर आंशिक पंजीकरण कैसे ठीक से करते हैं? AL को लिखना RAX पर एक झूठी निर्भरता है, और AH असंगत है