2011-10-03 12 views
5

मैं एमआईपीएस असेंबली भाषा का अध्ययन कर रहा हूं और इस उदाहरण में पुस्तक में आया हूं और मेरे लिए यह गलत लगता है। अगर यह है कि यह पहली गलती नहीं होगी जो मुझे इस पुस्तक में मिली है।सी से एमआईपीएस में कनवर्ट करें - नेस्टेड Arrays

चर f और g आवंटित कर रहे हैं रजिस्टरों $s0 और $s1 क्रमशः, सरणियों A और B के लिए आधार पतों $s6 और $s7 क्रमशः रहे हैं।

सी कोड उदाहरण है:

f = g - A[B[4]]; 

और प्रदान की इसी MIPS विधानसभा है:

lw $t0, 16($s7) 
lw $s0, 0($t0) 
sub $s0, $s1, $s0 

से मेरी समझ MIPS कोड ऊपर दिए गए पते पर स्मृति से कुछ यादृच्छिक डेटा लोड होगा $t0 द्वारा और फिर इसे $s1 से घटाएं और $s6 में निर्दिष्ट सरणी के सूचकांक $t0 तक नहीं पहुंचें।

मेरी समझ से सही MIPS विधानसभा की तर्ज पर होगा:

lw $t0, 4($s7) 
add $t0, $t0, $s6 
sll $t0, $t0, 2 
lw $s0, 0($t0) 
sub $s0, $s1, $s0 

मैं सही हूँ कि इस पुस्तक में कोई त्रुटि है या मैं कुछ गलत समझ रहा हूँ।


संपादित करें: ठीक किया MIPS कोड में एक त्रुटि फिक्स्ड रूप में क्रिस डोड

+3

मुझे लगता है कि आप सही हैं। बहुत बढ़िया! – davin

+1

आपकी व्याख्या उत्कृष्ट है। इस तथ्य का सबसे बड़ा सबूत यह है कि वह कोड जो नहीं कर रहा है, वह कर रहा है, यह है कि 's6' की कोई भी उल्लेख नहीं है, इसलिए सरणी 'ए' से तत्व को पुनर्प्राप्त करने का कोई तरीका नहीं है। – davin

+4

एरे मानते हुए ए तत्व प्रति 4 बाइट्स है (जैसा कि सरणी बी लगता है - आप तत्व 4 प्राप्त करने के लिए 16 का ऑफ़सेट उपयोग कर रहे हैं, और 4 बाइट प्राप्त करने के लिए एलडब्ल्यू निर्देशों का उपयोग कर रहे हैं), आपको एक जोड़ना होगा यहां 4 से गुणा करें (या 2 के बराबर शिफ्ट) –

उत्तर

0

जैसा कि मेरे कई लोगों ने बताया कि पुस्तक में एक त्रुटि हुई थी। इस त्रुटि को खोजने के बाद से मुझे ऐसी कई त्रुटियां मिलीं।

-1

द्वारा बताया लेकिन यह बहुत अच्छी तरह से हो सकता है कि लेखक लिंक समय से पहले कोड की नकल की। यह संभावना है कि लिंकर बयान

lw $s0, 0($t0) 
अंतिम निष्पादन में

में 0 के स्थान पर एक [] की स्मृति पते में भर जाता है खोलने छोड़ना होगा। मुझे नहीं पता कि एमआईपीएस उस आकार के ऑफसेट को अनुमति देता है (यानी, पता श्रेणी जहां ए [] अंत में रखा जा रहा है)। यह निश्चित रूप से किसी पुस्तक में कुछ समझाने का कोई अच्छा तरीका नहीं है, चुपचाप अपने स्वयं के परिसर को तोड़कर और आम तौर पर यह नहीं जानना कि क्या हो रहा है।

+1

यह काम नहीं करेगा क्योंकि ऑफसेट पर 16-बिट बाइट ऑफसेट पर हस्ताक्षर किए गए हैं और '32 s6' सिद्धांत में पूर्ण 32-बिट पता सीमा का उपयोग कर सकते हैं। पुस्तक में बस एक त्रुटि होने की संभावना अधिक है। (मुझे यह भी नहीं लगता कि कोई भी एमआईपीएस लिंकर इस तरह के अनुकूलन करेगा क्योंकि यह रिश्तेदार ऑफसेट के साथ वास्तव में बुरा होगा और ऑफसेट बहुत बड़ा होने वाले मामलों से निपटने के लिए होगा) – user786653

+0

कोई सैने असेंबलर/लिंकर कभी ऐसा नहीं करेगा। उस निर्देश पर क्या कोई भ्रम नहीं है। यह एक reg + imm पता के साथ एक स्पष्ट भार है। यह एक एचएलएल के लिए एक कंपाइलर की तरह नहीं है जो जो भी निर्देश चाहता है उसे सम्मिलित कर सकता है। –

4

यह किसी के लिए (संभवतः सीपीईई 381 छात्र) है जो इस पर एक अच्छा उदाहरण ढूंढने पर ठोकर खा सकता है। ओपी का संपादित कोड अभी भी गलत है। पहले लोड शब्द समारोह में ऑफ़सेट होना चाहिए 16. यह 4 हो सकता है अगर स्मृति चौड़ाई 32 बिट्स है, लेकिन फिर शिफ्ट/गुणा की आवश्यकता नहीं होगी। स्मृति को मानना ​​8 बिट चौड़ा है, ऐड और शिफ्ट फ़ंक्शंस को स्विच करने की आवश्यकता है। ओपी के कोड में, यह ए [बी [4]/4] के पते को गुणा कर रहा है 4. पहले स्थानांतरित/गुणा करने से सही सूचकांक प्राप्त होगा। सही कोड है:

lw $t0, 16($s7) # gets the value of B[4] 
        # offset could be 4 depending on memory width 
        # but then the shift would not be needed 
sll $t0, $t0, 2 # this multiplies the index by 4 to get the address offset 
add $t0, $t0, $s6 # adds the base address of A and the offset 
lw $t0, 0($t0) # loads the value at the address 
sub $s0, $s1, $t0 # performs subtraction and stores in f 

मामले में किसी को भी पूरे 4 बनाम और बदलाव की जरूरत है या नहीं, मुझे समझाती हूँ 16 वर्ष की भरपाई के बारे में उलझन है। यदि स्मृति चौड़ाई 32 बिट्स है तो एक संपूर्ण 32-बिट पूर्णांक को एक स्मृति स्थान में संग्रहीत किया जा सकता है। यदि यह मामला है, तो सरणी अनुक्रमणिका पता ऑफसेट के समान है। हालांकि, अगर स्मृति केवल 8 बिट्स (1 बाइट) चौड़ी है, तो 32-बिट पूर्णांक 4 मेमोरी स्थानों (प्रत्येक बाइट के लिए 1 पता) में संग्रहीत किया जाता है। यही कारण है कि आपको सही पता ऑफसेट प्राप्त करने के लिए इंडेक्स को 2 (या 4 से गुणा) में स्थानांतरित करने की आवश्यकता है।