मैं एमआईपीएस असेंबली भाषा का अध्ययन कर रहा हूं और इस उदाहरण में पुस्तक में आया हूं और मेरे लिए यह गलत लगता है। अगर यह है कि यह पहली गलती नहीं होगी जो मुझे इस पुस्तक में मिली है।सी से एमआईपीएस में कनवर्ट करें - नेस्टेड 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 कोड में एक त्रुटि फिक्स्ड रूप में क्रिस डोड
मुझे लगता है कि आप सही हैं। बहुत बढ़िया! – davin
आपकी व्याख्या उत्कृष्ट है। इस तथ्य का सबसे बड़ा सबूत यह है कि वह कोड जो नहीं कर रहा है, वह कर रहा है, यह है कि 's6' की कोई भी उल्लेख नहीं है, इसलिए सरणी 'ए' से तत्व को पुनर्प्राप्त करने का कोई तरीका नहीं है। – davin
एरे मानते हुए ए तत्व प्रति 4 बाइट्स है (जैसा कि सरणी बी लगता है - आप तत्व 4 प्राप्त करने के लिए 16 का ऑफ़सेट उपयोग कर रहे हैं, और 4 बाइट प्राप्त करने के लिए एलडब्ल्यू निर्देशों का उपयोग कर रहे हैं), आपको एक जोड़ना होगा यहां 4 से गुणा करें (या 2 के बराबर शिफ्ट) –