2012-02-27 59 views
1

當我運行我的程序時出現錯誤。 這是我得到的錯誤。MIPs程序使用堆棧反轉字符串

我收到一個異常錯誤。 一個錯誤說「數據錯誤地址/堆棧讀」

一個錯誤說「指令引用未定義的符號」

在控制檯它說 「字符串被逆轉:

COSC 300例外7 [錯誤數據地址]發生,並且忽略

程序

.data 

str: .asciiz "String to be reversed : \n" 
msg: .asciiz "COSC 300" 
ans: .asciiz "The string reversed is : " 

.text 
.globl main 



main: 

la $a0, str   #print string 
li $v0, 4 
syscall 

la $a0, msg   #print string 
li $v0, 4 
syscall 

la $t0, msg   #load a string to be reversed 



loop: 
lb $t0, 0 ($t0)  #load char from msg 
beqz $t0, stringEnd # if null end loop 
addi $sp, $sp -1  # reduce stack pointer 
sb $t0, 0 ($sp)  # store t0 into stack 
addi $t1, $t1, 1  # gets next char 
j loop 


stringEnd: 
la $t1, msg1 


storeLoop: 
lb $t0, 0($t0) 
beqz $t0, end 
lb $t4, 0($sp) 
sb $t4, 0 ($t0) 
addi $t1, $t1, 1 
addi $sp, $sp, 1 
j storeLoop 


end: 
la $a0, ans 
li $v0, 4 
syscall 

move $a0, $t4 
li $v0, 4 
syscall 

li $v0, 10 
syscall 

回答

3

第一個看起來有點有趣:

在循環和storeLoop中,您都使用$ t0作爲指針,也是要加載的字符。這意味着你第一次加載一個字節會損壞你的指針。

1

僞代碼:

print(intro) 
text = readString() 

// find the end of the string 
for (addr = text; *addr != NUL; addr++) { } 

// now print it backward 
while (--addr >= text) { 
printChar(*addr) 
} 

寄存器:

addr => $t0, tmp => $t1, orig => $t2 

    li  $v0, 4   # print(intro) 
    la  $a0, intro 
    syscall 

    li  $v0, 8   # text = readString() 
    la  $a0, text 
    li  $a1, 256  # (size of input buffer) 
    syscall 

    la  $t0, text  # addr = text 
    move $t2, $t0  # orig = addr (backup of original address) 
find: lb  $t1, 0($t0)  # tmp = *addr 
    beq  $t1, 0, print # while(tmp != NUL) 
    addi $t0, $t0, 1  # addr++ 
    j  find   # (end loop) 

print: subi $t0, $t0, 1  # --addr 
    blt  $t0, $t2, end # while (addr >= orig) 
    li  $v0, 11   # printChar(
    lb  $a0, 0($t0)  # *addr 
    syscall     #) 
    j  print   # (end loop) 

end: li  $v0, 10   # exit cleanly 
    syscall