2011-11-19 16 views
5

Sto provando a richiedere all'utente la lunghezza di una stringa, allocare lo spazio per quella stringa, quindi stamparlo al contrario.Inversione di una stringa nell'assieme MIPS

Per la vita di me, non riesco a capire il motivo per cui questo non sta funzionando ..

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

Ora la lunghezza della "stringa" dovrebbe essere 6 a destra? + il carattere di terminazione nullo che dovrebbe renderlo 7. Qualcuno può individuare dove sto andando male con il mio approccio?

.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

Hai provato passando attraverso la codice nel debugger? Sembra che tu pensi che l'indirizzo della stringa in '$ a0' non sia stato toccato dopo che syscall 8 è tornato, sei sicuro che sia così? – user786653

+2

Il [simulatore MARS MIPS] (http://courses.missouristate.edu/KenVollmar/MARS/) fa miracoli per il debug di assemblaggio – Msonic

risposta

6

c'era un piccolo errore nella indicizzazione ... e invece di ri scrivendo sulla parte superiore del vecchio ho usato nuovo spazio di memoria chiamata inverso ...

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