2013-10-26 13 views
5

मैं इस कोर्स को ले रहा हूं, और मैं वास्तव में निर्देश .align अवधारणा को समझने में संघर्ष कर रहा हूं।असेंबली एमआईपीएस को समझना .ALIGN और मेमोरी एड्रेसिंग

यहाँ एक उदाहरण है, जो मैं नहीं समझ सकता है:

enter image description here

मुझे पता है कि डेटा खंड के अंदर, वहाँ पते दिए गए हैं, 0x10010000,0x10010020 के साथ शुरू, आदि।

और मुझे पता है कि प्रत्येक पते के अंदर 8 मेमोरी फ़ील्ड हैं, प्रत्येक में 32 बिट है।

अब, मुझे समझ में नहीं आता कि 0xपते 0x10010010 के अंदर क्यों और क्यों? str1 पते 0x10010003 के अंदर है क्योंकि हमने var1 के लिए 3 बिट आरक्षित किए हैं।

आखिरी बात यह है कि वास्तव में निर्देश .align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I used 3` और ऊपर संरेखित है, लेकिन मुझे वास्तव में यह नहीं मिलता है।

मुझे खेद है कि यह बहुत भ्रमित करने वाला लड़का है, मैं यहां बहुत हताश हूं।

उत्तर

9

एक एमआईपीएस प्रोसेसर के लिए संरेखण महत्वपूर्ण है, यह केवल डेटा के आकार के एक पते पर स्मृति से बहु-बाइट मानों को पढ़ना पसंद करता है।

.ASCIIZ फ़ील्ड कहीं भी रखा जा सकता है क्योंकि स्ट्रिंग एक समय में एक बाइट पढ़ी जाती है। तो इसे 0x10010003 पर डालना ठीक है।

.WORD फ़ील्ड को 4 के एकाधिक से गठबंधन किया जाना चाहिए। इसलिए इसे स्ट्रिंग के बाद अगला उपलब्ध स्थान 0x1001000E पर नहीं रखा जा सकता है। असेंबलर जानबूझकर मूल्य को बदल देता है और दो बाइट अप्रयुक्त छोड़ देता है। अगले पते पर जो 4, 0x10010010 का एक बहु है।

.ALIGN निर्देश डिफ़ॉल्ट संरेखण नियमों को ओवरराइड करने का एक तरीका है। निर्देश के बाद अगला क्षेत्र एन की शक्ति के लिए 2 से अधिक के साथ गठबंधन किया जाएगा जहां n .ALIGN मान है। आपके मामले में यह पाउ (2, 3) = 8 बाइट्स है।

जो भी आप देख रहे हैं, बिना .ALIGN निर्देश के .HALF फ़ील्ड 0x10010014 पर संग्रहीत किया जाएगा। 8 का बहुमत नहीं है इसलिए इसे 0x10010018 पर ले जाया गया है।

उदाहरण अन्यथा कृत्रिम है, यहां से .ALIGN निर्देश का उपयोग करने का कोई स्पष्ट कारण नहीं है। केवल आधे को 2 में से एक के लिए एक संरेखण की आवश्यकता है ताकि 0x10010014 पर इसे संग्रहीत किया जा सके।

+1

फ़ोन पर मेरा जवाब टाइप कर रहा था, जबकि कोई नहीं था ... तुम्हारा एक और की आवश्यकता को रोक देगा। – gnometorule

+0

आपके उत्तर के लिए सभी को धन्यवाद! प्रश्न: कैसे 0x10010010 4 का एक बहु है? – Sobiaholic

+0

0x10010010 = 2^28 + 2^16 + 2^4, जो 4 गुणा है। यदि गणना आपको कोई समझ नहीं देती है, तो कृपया हेक्साडेसिमल संख्याओं पर फिर से पढ़ें। – gnometorule

3

कुछ असेंबली निर्देशों का अर्थ है कि डेटा गठबंधन किया जाता है, जिसका मतलब है कि दो की शक्ति है। MIPS में पहली सम्मेलनों के एक जोड़े को याद:

2 (1) एक "शब्द" 4 बाइट (आप कभी कभी देखेंगे यह 2 बाइट्स के रूप में परिभाषित),

(2) एक halfword है (.half) कर रहे हैं बाइट्स, और

(3) .asciiz null स्ट्रिंग को समाप्त करता है (सी में)।

इसका उपयोग करके, आपने पहले ही समझाया है कि var1 और str1 कैसे संग्रहीत किए जाते हैं। Var2 से पहले 2 खाली बाइट्स का बफर क्यों? चूंकि इसे एक .वर्ड घोषित किया गया है, और (ऊपर (1) ऊपर) को स्मृति स्थान पर शुरू किया जाएगा जो कि 4 का एक बहु है। अगर आपने इसे घोषित किया था। आधा, आपके पास str1 के बीच कोई 2 खाली बाइट नहीं होगा और var2।

var2 घोषित किया गया है। आधा - यह एक 16 बिट (2 बाइट) पता है जो एक में फिट बैठता है। हालांकि, इसे घोषित करने से पहले संरेखण 3 में बदल दिया गया है। अब, पहली वाक्य देखें: यह पावर है जिसे आप 2 तक बढ़ाते हैं; इसलिए हम वास्तव में 8 तक संरेखित करते हैं। इसका मतलब है कि ओवरराइड किए जाने तक, चर घोषित किए जाने के रूप में रखा जाएगा, लेकिन इसके अतिरिक्त उनके प्रारंभिक भंडारण स्थान को 8 का एक बहु होना चाहिए। इसलिए, असेंबलर 8 के एकाधिक पर var3 को स्टोर करने के लिए 4 खाली बाइट्स डालता है।

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