2010-04-13 17 views
7

मैं एक नौसिखिया प्रोग्रामर हूं जो पहली बार असेंबली का प्रयास कर रहा है। अग्रिम में क्षमा करें अगर यह एक अविश्वसनीय रूप से लंगड़ा सवाल है।x86 असेंबली में ऑपरेंड आकार का संघर्ष?

मेरे पास ईएक्स रजिस्टर में संग्रहीत एक चरित्र है, लेकिन मुझे इसे अपने डीएल रजिस्टर में स्थानांतरित करने की आवश्यकता है। जब मैं कोशिश करता हूं: mov dl, eax मुझे एक त्रुटि मिलती है C2443: ऑपरेंड आकार का संघर्ष। मुझे पता है कि ईएक्स रजिस्टर 32 बिट है जबकि डीएल 8 बिट है ... क्या मैं कुछ पर हूं ?? मैं इसे हल करने के बारे में कैसे जा सकता हूं।

उत्तर

6

xor edx,edx 
mov dl, al 

शायद का प्रयास करें? Edx (वैकल्पिक) के 'अन-निरंतर' उच्च ऑर्डर बिट्स को शून्य करने के लिए पहला निर्देश, फिर केवल 8 को ईएक्स से एडैक्स में ले जाएं।

जैसा कि अन्य ने इंगित किया है, movzx इसे एक चरण में करता है। यह उल्लेखनीय है कि एक ही पंक्तियों के साथ, यदि आपके पास पर मूल्य पर हस्ताक्षर किए गए हैं, तो आप एएसएक्स के उच्च आदेश बिट्स को अल के एमएसबी की एक प्रति भरने के लिए "movsx edx, al" का उपयोग कर सकते हैं, जिससे हस्ताक्षरित हो Edx में अल का 32 बिट प्रतिनिधित्व।

+0

यह सही है। ईएक्स रजिस्टर 32 बिट चौड़ा है, जबकि डीएल केवल 8 बिट्स है। आपको एएल को डीएल में स्थानांतरित करने की आवश्यकता है, एएल ईएक्स का सबसेट है। – MPelletier

+0

और xoring edx सिर्फ एक अच्छा अच्छा विचार है :) अच्छा और साफ। – MPelletier

+0

मुझे पहले निर्देश को समझ में नहीं आता है। % Edx में बिट्स के edx, edx 'शून्य * * बिट * नहीं होगा? –

3

तुम सिर्फ eax के निचले 8 बिट का उपयोग करना चाहते हैं, तो अल का उपयोग करें:

mov dl, al 

आप को बदलने के द्वारा कम 8 बिट, 16 बिट, या प्रत्येक सामान्य प्रयोजन रजिस्टर के 32 बिट का उपयोग कर सकते शुरुआत या अंत में पत्र। रजिस्टर ईएक्स के लिए, ईएक्स का उपयोग करने का मतलब है सभी 32 बिट्स का उपयोग करें, कुल्हाड़ी कम 16 बिट्स है, और अल कम 8 बिट्स है। ईबीएक्स के बराबर क्रमशः ईबीएक्स, बीएक्स और ब्लू है, और इसी तरह।

ध्यान दें कि यदि आप रजिस्टर के निचले 16 या 8 बिट्स को संशोधित करते हैं, तो ऊपरी बिट अपरिवर्तित होते हैं। उदाहरण के लिए, यदि आप सभी को ईएक्स में लोड करते हैं, तो शून्य में शून्य लोड करें, तो ईएक्स के निचले 8 बिट शून्य होंगे, और उच्च 24 बिट्स होंगे।

mov eax, -1 ; eax is all ones 
mov al, 0 ; higher 24 bits are ones, lower 8 bits are zeros 
+0

डीएल में एल को स्थानांतरित करना मूल मामला है। शून्य-भरना या साइन-एक्सटेंशन आवश्यक हो सकता है या नहीं हो सकता है क्योंकि जब आप हाथ से कोडित असेंबली चुनते हैं - या कम से कम, नंगे हड्डियों के समाधान के बाद होना चाहिए: "अच्छा होना" एक महंगा लक्जरी और स्वाभाविक रूप से छोड़ा गया है। –

11

क्या आप चाहते हैं शायद है:

movzx edx, al 

यह अल डीएल कॉपी और शून्य को भरने EDX के बाकी होगा। यह एकल निर्देश इन दो निर्देशों के बराबर है:

xor edx, edx 
mov dl, al 
+3

मैं इसे पसंद करता हूं। movzx सभी पिछली बिट्स का ख्याल रखता है। कुछ abstraction के लिए हाँ! (मेरा उत्साह असेंबली के साथ अनुभव की कमी को धोखा देना चाहिए)। – MPelletier

संबंधित मुद्दे