2011-11-19 16 views
5

मैं उपयोगकर्ता को एक स्ट्रिंग की लंबाई के लिए संकेत देने की कोशिश कर रहा हूं, उस स्ट्रिंग के लिए स्थान आवंटित करें, फिर इसे विपरीत में प्रिंट करें।एमआईपीएस असेंबली में एक स्ट्रिंग को रिवर्स करना

मुझे के जीवन के लिए, मैं क्यों यह काम नहीं कर रहा को समझ नहीं सकता ..

Sample Output: 
(spim) run  
Please enter an integer:  
7  
string 
(spim) 

अब "स्ट्रिंग" की लंबाई 6 सही होना चाहिए? + शून्य समापन चरित्र जो इसे बनाना चाहिए 7. क्या कोई भी इस स्थान पर जा सकता है कि मैं अपने दृष्टिकोण के साथ गलत कहां जा रहा हूं?

.data 
    nl: .asciiz "\n" 
    inputPrompt: .asciiz "Please enter an integer:\n" 

    theString: .space 32 
    theInteger: .word 1 

.text 
main: 
    la $a0, inputPrompt #load address a0 with prompt 
    li $v0, 4  #load system call, print string into v0 
    syscall 

    li $v0, 5  #load system call, read int into v0 
    syscall 
    sw $v0, theInteger #store saved int into $t0 

    li $v0, 8   #load system call, read string with mem address 
    la $a0, theString #load address of reserved string space 
    lw $a1, theInteger #load address of saved int length for string  
    syscall 

    lw $t0, theInteger 
    add $a1,$zero,$t0 #pass lenght of string 
    jal stringreverse #reverse the string 

stringreverse: 
    add $t0,$a0,$zero #starting address 
    add $t1,$zero,$zero  #i = 0 
    addi $t2,$a1,-1  #j = length-1 

loop: 
    add $t3,$t0,$t1 
    lb $t4,0($t3) #the lb string[i] 
    add $t5,$t0,$t2 
    lb $t6,0($t5) #the lb string[j] 
    sb $t4,0($t5) #string[j] = string[i] 
    sb $t6,0($t3) #string[i] = string[j] 
    addi $t1,$t1,1 #i++ 
    addi $t2,$t2,-1  #j-- 

    slt $t6,$t2,$t1 
    beqz $t6,loop 

exit: 
    li $v1, 4  #system call to print reversed string 
    la $a2, 0($a1) 
    syscall 

    li $v0, 10 
    syscall   # Exit program 
+0

आप के माध्यम से कदम की कोशिश की है डीबगर में कोड? ऐसा लगता है कि आप मानते हैं कि '$ a0' में स्ट्रिंग का पता syscall 8 रिटर्न के बाद छूटा नहीं गया है, क्या आप निश्चित हैं कि यह मामला है? – user786653

+2

[मार्स एमआईपीएस सिम्युलेटर] (http://courses.missouristate.edu/KenVollmar/MARS/) डिबगिंग असेंबली के लिए चमत्कार करता है – Msonic

उत्तर

6

अनुक्रमण में एक छोटी सी त्रुटि थी ... और पुराने वाले को मैं नई स्मृति स्थान रिवर्स कहा जाता इस्तेमाल किया की चोटी पर लिख रहे हैं के बजाय ...

stringreverse: 
    add $t0,$a0,$zero #starting address 
    add $t1,$zero,$zero  
    add $t3,$zero,$zero  #i = 0 
    addi $t2,$a1,-2  #j = length-1 

loop: 
    add $t5,$t0,$t2 
    lb $t6,0($t5) #the lb string[j] 
    sb $t6,reverse($t3) 
    addi $t2,$t2,-1  #j-- 
    addi $t3,$t3,+1  #i++ 

    slt $t7,$t2,$t1 
    beqz $t7,loop