2012-12-26 21 views
20

मैं इस ट्यूटोरियल के माध्यम से देख रहा हूँएआरएम असेंबली में एमओवी (या इसके विपरीत) पर एलडीआर का उपयोग क्यों करें? <a href="http://www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/os/ok01.html" rel="noreferrer">http://www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/os/ok01.html</a></p> <p>विधानसभा की पहली पंक्ति है:

ldr r0,=0x20200000 

पीछे नहीं है:

mov r1,#1 

मैंने सोचा था कि ldr में स्मृति से लोड हो रहा है मानों के लिए था रजिस्टरों। लेकिन ऐसा लगता है कि = का अर्थ है 0x20200000 एक मान स्मृति स्मृति नहीं है। दोनों लाइनें पूर्ण मान लोड कर रही हैं।

+0

एक प्रासंगिक [एआरएम ब्लॉग पोस्ट] (http://community.arm.com/groups/processors/blog/2010/07/27/how-to-load-constants-in-assembly-for-arm-architecture)। –

+0

ए [फोरम थ्रेड] (https://www.raspberrypi.org/forums/viewtopic.php?और टी = 16528) बिल्कुल वही प्रश्न पूछ रहे हैं। –

उत्तर

17

यह एक चाल/शॉर्टकट है। उदाहरण के लिए कहते हैं कि

ldr r0,=main 

क्या होगा कोडांतरक अनुदेश के पास, एक डेटा शब्द का आवंटन होगा, लेकिन शिक्षा पथ के बाहर

ldr r0,main_addr 
... 
b somewhere 
main_addr: .data main 

अब उन स्थिरांक/immediates है कि चाल का विस्तार, esp है कि नहीं कर सकते एक कदम तत्काल अनुदेश में फिट:

top: 
add r1,r2,r3 
ldr r0,=0x12345678 
eor r1,r2,r3 
eor r1,r2,r3 
b top 

तो एकत्रित न इकट्ठा

00000000 <top>: 
    0: e0821003 add r1, r2, r3 
    4: e59f0008 ldr r0, [pc, #8] ; 14 <top+0x14> 
    8: e0221003 eor r1, r2, r3 
    c: e0221003 eor r1, r2, r3 
    10: eafffffa b 0 <top> 
    14: 12345678 eorsne r5, r4, #125829120 ; 0x7800000 

और आप देखते हैं कि असेंबलर ने आपके लिए डेटा शब्द जोड़ा है और एलडीआर को आपके लिए एक पीसी रिश्तेदार में बदल दिया है।

अब अगर आप एक तत्काल कि एक mov अनुदेश में फिट है, तो gnu के रूप में मैं उपयोग कर रहा हूँ के साथ शायद, निश्चित रूप से कोडांतरक पर निर्भर करता है, यह मेरे लिए

top: 
add r1,r2,r3 
ldr r0,=0x12345678 
ldr r5,=1 
mov r6,#1 
eor r1,r2,r3 
eor r1,r2,r3 
b top 


00000000 <top>: 
    0: e0821003 add r1, r2, r3 
    4: e59f0010 ldr r0, [pc, #16] ; 1c <top+0x1c> 
    8: e3a05001 mov r5, #1 
    c: e3a06001 mov r6, #1 
    10: e0221003 eor r1, r2, r3 
    14: e0221003 eor r1, r2, r3 
    18: eafffff8 b 0 <top> 
    1c: 12345678 eorsne r5, r4, #125829120 ; 0x7800000 

तो एक mov में बदल गया का उपयोग

यह मूल रूप से एक टाइपिंग शॉर्टकट है, समझते हैं कि आप असेंबलर को लगातार स्थिर रहने के लिए एक जगह खोजने की शक्ति दे रहे हैं, जो आमतौर पर एक अच्छी नौकरी करता है, कभी-कभी शिकायत करता है, यह सुनिश्चित नहीं करता कि मैंने इसे सुरक्षित रूप से करने में असफल रहा है या नहीं। कभी-कभी आपको एक जगह खोजने के लिए असेंबलर को प्रोत्साहित करने के लिए कोड में .ltorg या .pool की आवश्यकता होती है।

+0

आपके उत्तर के लिए धन्यवाद, मैं असेंबली के लिए बहुत नया हूँ। तो हमारा जवाब मेरे ऊपर थोड़ा सा है। 'Ldr' के लिए क्या आपका मतलब है कि मान को "असेंबलर द्वारा" स्मृति में "डाल" दिया जाएगा और फिर निष्पादित होने पर स्मृति से लोड किया जाएगा, जबकि' mov' के लिए मान वास्तव में निर्देश का हिस्सा है? और इसलिए यदि निर्देश में फिट होने के लिए मूल्य बहुत बड़ा है तो आपको 'ldr' का उपयोग करना होगा। –

+2

mov का अर्थ है एक मान को एक रजिस्टर में ले जाएं। एलडीआर का मतलब है एक रजिस्टर में एक मूल्य लोड करें। str, स्टोर रजिस्टर से स्मृति में है। और = पता शॉर्टकट कोई समझ नहीं आता है। (रजिस्टर में पता लगाने के लिए एलडीआर = पता करना समझ में आता है, फिर उस पते पर कुछ रजिस्टर की सामग्री को मेमोरी में डालने के लिए स्टोर करें) –

+2

यह भी समझता है कि हाथ में "बहुत बड़ा" मतलब क्या है, इसका मतलब है कि वहां से अधिक हैं 8 बिट्स को अलग करना। तो mov rd, # 0x21000000 पूरी तरह से मान्य है, लेकिन 0x201 नहीं है। –

6

एक छोटी प्रतिक्रिया, केवल आपके स्तर के करीब है, उम्मीद है कि यह मदद करता है: एआरएम में, निर्देशों में 32 बिट हैं। ऑपरेशन की पहचान करने के लिए कुछ बिट्स का उपयोग किया जाता है, कुछ ऑपरेटरों के लिए, और, एमओवी निर्देश के मामले में, कुछ तत्काल मूल्य (उदाहरण के लिए, # 1) के लिए उपलब्ध हैं।

जैसा कि आप here (पृष्ठ 33) देख सकते हैं, तत्काल मूल्य के लिए केवल 12 बिट उपलब्ध हैं। संख्या के रूप में प्रत्येक बिट का उपयोग करने के बजाय (जो 0 से 2^12-1 ~ 40 9 5 तक है), निर्देश अंतिम 4 बिट्स में निर्दिष्ट राशि के पहले 8 बिट्स को सही (आरओआर) घुमाकर तत्काल संख्या की गणना करता है । वह है, immediate = first 8 bits ROR 2*(last four bits)

इस तरह, हम केवल 4096 की तुलना में अधिक संख्या प्राप्त कर सकते हैं (संभावित तत्काल के संक्षिप्त सारांश के लिए पृष्ठ 34 देखें)।

शायद ज़रुरत पड़े कि हमारे संख्या पिछले एक की तरह एक निर्देश में परिवर्तित नहीं किया जा सकता है, तो, हम लीडर r0 उपयोग करने के लिए, = 257

(257 8 बिट के रूप में व्यक्त नहीं किया जा सकता दो बार किसी भी 4 बिट्स घुमाया)

इस मामले में, कंपाइलर प्रोग्राम कोड के करीब, स्मृति में संख्या 257 बचाता है, इसलिए इसे पीसी के सापेक्ष संबोधित किया जा सकता है, और इसे स्मृति से लोड करता है, जैसा कि विस्तार से विस्तार से बताया गया है।

नोट: यदि आप उस ट्यूटोरियल का पालन करते हैं, तो जब आप mov r0 के साथ 'बनाना' करने का प्रयास करते हैं, तो # 257 आपको एक त्रुटि मिल जाएगी, और आपको मैन्युअल रूप से ldr r0, = 257 आज़माएं।

+1

प्रश्न को समझता हूं, तो एक छोटी सी छोटी प्रतिक्रिया होगी कि 'एलडीआर' आपको बड़ी संख्याओं का उपयोग करने देता है? – Yay295

+0

यह यहां भी समझाया गया है कि http://www.peter-cockerell.net/aalp/html/ch-3.html (तत्काल संचालन पर अनुभाग देखें) – enthusiasticgeek

0

अन्य उत्तरों के जितना अच्छा है, मुझे लगता है कि मैं जवाब को सरल बनाने में सक्षम हूं।

लीडर = लोड रजिस्टर

mov = इस कदम

दोनों को प्रभावी ढंग से एक ही बात है, लेकिन अलग अलग तरीकों से।

अंतर सी भाषा में

#define CONST 5 

और

int CONST = 5; 

के बीच अंतर की तरह एक बहुत कुछ है।

mov वास्तव में तेज़ है क्योंकि इसमें निर्देश के एक हिस्से के रूप में सीधे साथ दिया गया मूल्य है (ऊपर दिए गए उत्तर में वर्णित 12 बिट प्रारूप में)। इस मूल्य को स्टोर करने के तरीके के कारण इसमें कुछ सीमाएं हैं। क्यूं कर? क्योंकि

  • 12 बिट्स 32-बिट मेमोरी पतों जैसे विशाल संख्याओं को संग्रहीत करने के लिए पर्याप्त नहीं हैं।
  • पहले 8 बिट आरओआर 2 * (अंतिम 4 बिट्स) 12 बिट रेंज में भी किसी भी संख्या का प्रतिनिधित्व नहीं कर सकते हैं।

लीडर, दूसरे हाथ पर, बहुमुखी (मुख्य रूप से संकलक अनुकूलन के कारण) है। यह इस तरह काम करता है (जैसा कि disassembled दिनचर्या में दिखाया गया है)

  • मूल्य 12 बिट में प्रतिनिधित्व किया जा सकता है, तो & पहले 8 बिट ROR 2 * (पिछले 4 बिट्स) स्वरूप तो संकलक करने के लिए यह परिवर्तन एक mov मूल्य के साथ निर्देश।

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

मुझे आशा है कि इससे मदद मिलेगी।