2010-02-26 18 views
8

कोई विचार नहीं है? मैं क्यों मिल रही है: रनटाइम अपवाद 0x00400020 पर: शब्द सीमा 0x00000007 समस्या लाइन पर गठबंधन नहीं पता लाने जाता है: सरणीएमआईपीएस लांच पता शब्द सीमा पर गठबंधन नहीं किया गया, इस्तेमाल किया .align 4, अभी भी

.data 
    .align 4 #added this, didnt work 
    size: .word 7 
    .align 4 #added this, didnt work 
    search: .word 30 
    .align 4 #added this,didnt work 
    array: .word 10,20,30,40,50,60,70 
    .align 4 

.text 

main: 

      la $a0,array #$a0 = address of array 
      lw $a1,size #a1 = size of array 
      lw $a2,search #$a2 = search key 


COUNT: 
      lw $s0,0($a0) #copy arg1 = address array 
      addi $s1,$zero,7 
      lw $s1,0($a1) #copy arg2 = size of array 
      lw $s2,0($a2) #copy arg3 = search key (n) 
      addi $s2,$zero,30 
      COUNTLOOP: 
      add $v0,$zero,$zero #v0 = res 
      add $t0,$zero,$zero #$t0 = init i to 0 
      slt $t1,$t0,$s1  #check if i > size of array 
      beq $t1,$zero,DONECOUNT #i is n so end 
      sll $t2,$s0,2  #$t2 = get off set for a[i] 
      lw $t3,0($t2)  #$t3 = get value of a[i] 
      bne $t3,$s2,CLOOPBTM #check if a[i] == seach key 
      addi $v0,$v0,1  #if above then increment res 
      CLOOPBTM: 
      addi $t0,$t0,1 
      j COUNTLOOP 
      DONECOUNT: 

उत्तर

7

के साथ समस्या का LW $ s1,0 ($ A1) #copy ARG2 = आकार कोड है, कि तुम जहां आकार संग्रहीत किया जाता है पता लेकिन आकार में ही उपयोग नहीं कर रहे:

यहाँ आप A0 में पता लोड और आकार (7) ए 1 में:

 la $a0,array 
     lw $a1,size #a1 = size of array 

यहाँ आप अपने सरणी में संग्रहीत पहला शब्द लोड करते हैं (वह एक 10 लोड होगा)। यह वह नहीं है जिसका आपने इरादा किया है।

 lw $s0,0($a0) #copy arg1 = address array 
     addi $s1,$zero,7 

यहां आप स्थान 0x000007 पर संग्रहीत पहला शब्द लोड करते हैं। (आपका आकार)। यह शायद भी इरादा नहीं है और क्योंकि पता मेल नहीं किया गया एक अपवाद का कारण होगा:

 lw $s1,0($a1) #copy arg2 = size of array 

और इतने पर।

ऐसा लगता है कि आपको गलतफहमी है कि एलडब्ल्यू निर्देश क्या करता है। यह एक रजिस्टर में एक स्मृति स्थान पढ़ता है। आप अपने लूप के प्रस्ताव में क्या चाहते हैं एक रजिस्टर की प्रतियां बनाना है।

ऐसा करने के लिए यदि आप अपने असेंबलर का समर्थन करते हैं तो आप चाल छद्म निर्देश का उपयोग कर सकते हैं। अन्यथा इस तरह रजिस्टरों कॉपी करने के लिए या अनुदेश का उपयोग करें: एक रेखीय खोज पाश की एक पूरी उदाहरण के लिए

COUNT: 
      or $s0, $a0, $a0 #copy arg1 = address array 
      addi $s1, $zero,7 
      or $s1, $a1, $a1 #copy arg2 = size of array 
      or $s2, $a2, $a2 #copy arg3 = search key (n) 
      addi $s2, $zero,30 
      COUNTLOOP: 

      ... 

इस कोशिश (अपरीक्षित और उम्मीद है कि कोडांतरक देरी स्लॉट के बारे में परवाह करता है)

main: 

      la $a0,array   # $a0 = address of array 
      lw $a1,size    # $a1 = size of array 
      lw $a2,search   # $a2 = search key 


      beq $a1, $zero, NOTFOUND # handle the size==0 case.. 
      or $v0, $zero, $zero # init counter to zero 

LOOP: 
      lw $s0, 0($a0)   # load element 
      beq $s0, $a2, FOUND  # branch if key found: 

      addiu $a0, $a0, 4  # increment array pointer 
      addiu $v0, $v0, 1  # increment loop counter 
      bne $v0, $a1, LOOP  # repeat until we've processed the array. 

NOTFOUND: 
      # -------------------------------------- 
      # if you reach this, key does not exist: 
      # -------------------------------------- 
      li $v0, -1    # load a -1 to signal key not found. 
      jr $lr     # return to caller 

FOUND: 
      # ----------------------------------------- 
      # v0 now contains the position of the key. 
      # ----------------------------------------- 
      jr $lr 
+0

अरे, मैं वास्तव में सहायता के लिए आभारी हूं। यह काफी रैखिक खोज नहीं है, यह सिर्फ एक पुस्तक से एक समस्या है जो एक और संख्या जोड़ती है, लेकिन यह अप्रासंगिक है। मैं वापस गया और कुछ गलतियों पर ध्यान दिया, लेकिन मुझे अभी भी समस्याएं थीं। मेरी समस्याएं इसके आसपास घूमती हैं: la $ a0, array \t #if यह सरणी के पते को 0 और lw $ s0, ($ a0) में लोड करता है # क्या यह s0 पर संग्रहीत पते की प्रतिलिपि नहीं बना सकता है यह मेरे कोड में ला $ s0 कर रहा है, ($ a0) जिस तरह से मैंने एलडब्ल्यू को समझ लिया है, वह उस स्मृति पते पर संग्रहीत मूल्य प्राप्त करता है और इसे रजिस्टर में रखता है। तो क्या यह गलत है? यह सिर्फ पता स्टोर करता है? – bep

+0

ला प्रतीक के पते को लोड करता है। आपके मामले में इसमें सरणी के पहले तत्व का स्थान होगा। lw स्मृति से मेमोरी सेल लोड करता है और इसे गंतव्य रजिस्टर में संग्रहीत करता है। ला $ s0, ($ a0) कोई समझ नहीं आता है। ला हमेशा आपके कोड से एक प्रतीक लेता है, कभी रजिस्टर नहीं। –

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