2010-04-12 9 views
14

के रूप में तत्काल संख्या के साथ एआरएम में एमओवी निर्देश का उपयोग कैसे करें, मैं सिर्फ एआरएम असेंबली भाषा का अध्ययन करना शुरू करता हूं, और एमओवी का उपयोग किसी रजिस्टर में तत्काल संख्या को स्थानांतरित करने के तरीके के बारे में स्पष्ट नहीं हूं।दूसरे ऑपरेंड

एआरएम संदर्भ मैनुअल और मेरी पाठ्यपुस्तक दोनों से, यह कहा जाता है कि एमओवी निर्देश के बाद तत्काल संख्या की सीमा 0-255 है। लेकिन जब मैं अपने पीसी पर एडीएस 1.2 आईडीई में परीक्षण करता हूं, निर्देश

MOV  R2, #0xFFFFFFFF 

अच्छी तरह से प्रदर्शन करता है। विनिर्देश के अनुसार सीमा से बाहर 0xFFFFFFFF संख्या नहीं है?

आशा है कि कोई मुझे हाथ दे सके।

सम्मान।

उत्तर

12

याद रखें कि एआरएम एआरएम के ऑपकोड में शामिल बैरल शिफ्ट के हिस्से के रूप में तत्काल मूल्य पर हेरफेर का एक निश्चित सेट कर सकता है।

इस छोटे लेख चाल है कि एक हाथ कोडांतरक एक हाथ अनुदेश के छोटे उपलब्ध अंतरिक्ष में एक बड़ी तत्काल संख्या फिट करने के लिए उपयोग कर सकते हैं में से कुछ का स्पष्ट स्पष्टीकरण में से एक है:

आलेख तत्काल मूल्य के बिटवाइफ़ पूरक को लोड करने के लिए एमवीएन ऑपोड उत्पन्न करने के आपके विशिष्ट उदाहरण में उपयोग की जाने वाली चाल की चर्चा करता है।

इस तरह के हेरफेर सभी तत्काल मूल्यों के साथ नहीं किया जा सकता है, लेकिन एआरएम असेंबलर इसके बारे में काफी समझदार हैं (और सी कंपाइलर निश्चित रूप से हैं)। यदि कोई शिफ्ट/पूरक चाल नहीं की जा सकती है, तो मूल्य आमतौर पर पीसी-रिश्तेदार स्थान से लोड किया जाएगा या शायद कई निर्देशों से मूल्य को 'बिल्ड अप' कर दिया जाएगा।

+0

@ माइकल आपकी युक्तियों के लिए धन्यवाद। मैं यही जानना चाहता हूं! :-) –

+0

क्या किसी को पता है ** क्यों ** असेंबलर कुछ मान बनाता है, लेकिन दूसरों को सीधे लोड करेगा? न्यूटन रोम कोड (स्ट्रॉन्ग्राम 110) के चारों ओर देखकर बहुत सारे "एक-निर्देश लोड" (जैसे "एमओवी आर 1, 0x0c1b518") है, लेकिन मेरा सभी कोड "बिल्ड-अप लोड" के साथ आता है - जैसे निम्न कोड: –

+0

.. (ओह, शुरुआती पोस्टिंग गलती) .. जैसे "एमओवी आर 1, 0x0C000000/एडीडी आर 1, आर 1,0x100000"। मुझे लगता है कि प्रोसेसर 32-बिट मानों को एन्कोड करता है, इसके साथ ऐसा कुछ करने के लिए हो सकता है। प्रोसेसर माइक्रोक्रोड के लिए एक एकल एमओवी और फिर एडीडी का उपयोग करके संख्याओं का निर्माण करने के लिए यह अधिक कुशल है? –

-1

एक संभावना यह है कि एआरएम असेंबलर संख्या के महत्वपूर्ण बिट्स को फेंक देता है और केवल निम्नतम एफएफ का उपयोग करता है।

एमओवी निर्देश कई सीपीयू निर्देश सेटों में एक प्रमुख है, और आमतौर पर असेंबलर लक्ष्य रजिस्टर के आकार और तत्काल मूल्य प्रदान किए जा रहे हैं।

उदाहरण के लिए 86 सेट से निम्नलिखित MOV निर्देश

MOV BL, 80h, ; 8bit 
MOV BX, ACACh ;16bit 
MOV EBX, 12123434h ; 32bit 
1

आप मूल मूल्य का साइन-विस्तार से कलाकृतियों दिखाई जा रही है कर रहे हैं। यदि आप जिस उपकरण का उपयोग कर रहे हैं, वह डिस्सेप्लर को 0..255 को हस्ताक्षरित बाइट के रूप में संभालता है, तो जब यह इसे एक बड़े int प्रकार (या रजिस्टर) में लोड करता है तो यह मूल के साइन बिट के साथ सभी ऊपरी बिट्स भर देगा मूल्य। या इसे एक और तरीका रखने के लिए, यदि 0xFF एक हस्ताक्षरित बाइट है तो इसका दशमलव मान -1 है। इसे 32 बिट रजिस्टर में रखें और हेक्स 0xFFFFFFFF जैसा दिखेगा, और इसका दशमलव मान अभी भी -1 है।

उच्च बिट सेट के बिना किसी मान का उपयोग करने का प्रयास करें, जैसे 0x7F। चूंकि साइन बिट सेट नहीं है, इसलिए मुझे लगता है कि यह बड़े int टाइप रजिस्टर या फ़ील्ड में लोड होने पर ऊपरी बिट्स को शून्य से भर देगा।

यह भी संभव है कि संकलक/असेंबलर आपके द्वारा प्रदान किए जाने वाले मूल्य को कम कर देता है। मैं इसे एक स्रोत कोड त्रुटि मानता हूं, लेकिन असेंबलर मजाकिया जानवर हैं। यदि आप इसे 0x7FF देते हैं, तो यह 0x7FF (छोटा नहीं हुआ, और 0..255 से बड़ा) या 0xFFFFFFFF (0..255 पर हस्ताक्षर किए गए, बाइट हस्ताक्षरित) तक संकलित करता है?

11

एक एकल एआरएम निर्देश केवल तत्काल स्थिरता को एन्कोड कर सकता है जिसे 8-बिट तत्काल मूल्य के रूप में प्रदर्शित किया जा सकता है, जिसे किसी भी द्वारा दो की शक्ति से स्थानांतरित किया जा सकता है।

हालांकि, MVN निर्देश भी है, जो MOV जैसा है लेकिन सभी बिट्स को बदल देता है। इसलिए, MOV R2, #0xFFFFFFFF को MOV निर्देश के रूप में एन्कोड नहीं किया जा सकता है, इसे MVN R2, #0 के रूप में एन्कोड किया जा सकता है। असेंबलर आपके लिए यह रूपांतरण भी कर सकता है।

1

यह निर्धारित करना मुश्किल है कि दिए गए स्थिरांक वैध सीमा के भीतर हैं या नहीं।

तरह मैथ्यू पहले ही उल्लेख किया, कोडांतरक आप हाथ mov/mvn की तरह समान के साथ दिए गए निर्देशों की जगह, लोगों को नकारने, द्वारा उधार देता है, सीएमपी/CMN, tst/tne आदि

2

MOV अनुदेश या तो imm16 मूल्य स्वीकार कर सकते हैं या

  • किसी भी निरंतर कि हो सकता है: Operator2 मूल्य है, जो निम्नलिखित से कोई भी नियम का पालन करना चाहिए (स्मृति संरेखण के लिए विरोध अनुदेश लंबाई के कारण) (CortexM अनुदेश सेट मैनुअल से नकल, एक्स और वाई किसी भी हेक्स-मान है) 32-बिट शब्द के भीतर किसी भी बिट्स द्वारा छोड़े गए 8-बिट मान को स्थानांतरित करके उत्पादित किया गया।
  • फॉर्म 0x00XY00XY के किसी भी स्थिरांक।
  • फॉर्म 0xXY00XY00 के किसी भी स्थिरांक।
  • फॉर्म 0xXYXYXYXY के किसी भी स्थिरांक।

यही कारण है कि 0xFFFFFFFF स्वीकार किया जाता है (चौथा नियम अनुरूप है)।

यदि आप अपने 32 बिट स्थिरांक को इकट्ठा करना चाहते हैं, तो आप निर्देश MOVT का उपयोग कर सकते हैं, जो एक रजिस्टर के ऊपरी हिस्से में लिखता है।

+0

फिर यह 0x45454545 क्यों नहीं देगा? असल में 0x00450045 भी। – JSmyth

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