2014-04-20 79 views
1

試圖讓此程序正常工作,但我無法弄清楚爲什麼我總是收到錯誤。程序假設輸入11個字符,然後輸出反向輸入。錯誤如下。在MIPS中反轉字符串

運行時異常在0x00400034:店面地址字邊界0x7fffeffb

的代碼如下張貼在未對齊。我還需要將最終的反轉字符串存儲到'revstr'中。我只是在逆轉中遇到麻煩。

.data 
str: .space 12 
revstr: .space 12 
prompt: .asciiz "Enter in string, max 11 characters: " 
.text 
main: 

    la  $a0, prompt  #calling opening prompt 
    li  $v0, 4 
    syscall 

    li $v0, 8 
    la $a0, str 
    li $a1, 12 
    syscall 

    li $t0, 0 
    subu $sp, $sp, 1 
    sw $t0, ($sp) 
    li $t1, 0 

bump1: 
    lbu $t0, str($t1) 
    beqz $t0, stend 
    subu $sp, $sp, 4 
    sw $t0, ($sp) 
    addu $t1, $t1, 1 
    j bump1 

stend: li $t1, 0 

populate: 
    lw $t0, ($sp) 
    addu $sp, $sp, 4 
    beqz $t0, done 
    sb $t0, str($t1) 
    addu $t1, $t1, 1 
    j populate 

done: 
    li $v0, 4 
    la $a1, str 
    syscall 
    li $v0, 10 
    syscall 

回答

1

您使用的是32位機,應使用那些的4個字節

=> 4×8 = 32

倍數偏移您字對齊

否則你的指令必須是面向字節(LB SB LBU等不LW ..)

還糾正這些:

lw $t0, ($sp)最好指定偏移量以避免混淆

+0

實際上,偏移量是一個隱含的'0'至少在我的MIPS組裝的味道。 –

0

您發佈的代碼讓我很困惑。你正在修改$sp在一個通常是禁止的函數的中間,我不知道你爲什麼這樣做。此外,你說你想存儲反向字符串revstr,但所有sb指令都指向str

將程序集與其他人進行通信時,給他們一些僞代碼以向他們展示您嘗試使用的一般方法是一個好主意。這裏是我的:

str := user_input() 
$t1 := len(str) 
$t2 := 0 
while ($t1 >= 0) { 
    revstr[$t2] := str[$t1] 
    $t1 := $t1 - 1 
    $t2 := $t2 + 1 
} 

有了,精神的圖片,它應該是很容易明白,我怎麼已經修改了你的裝配:

str: .space 12 
revstr: .space 12 
prompt: .asciiz "Enter in string, max 11 characters: " 

.text 
main: 

    la $a0, prompt  #calling opening prompt 
    li $v0, 4 
    syscall 

    li $v0, 8 
    la $a0, str 
    li $a1, 12 
    syscall 

    li $t1, 0 

bump1: 
    lbu $t0, str($t1) 
    beqz $t0, stend 
    addu $t1, $t1, 1 
    j bump1 

stend: 
    li $t2, 0 
    addi $t1, $t1 -1 

populate: 
    blt $t1, $zero, done 
    lb $t3, str($t1) 
    sb $t3, revstr($t2) 
    sub $t1, $t1, 1 
    add $t2, $t2, 1 
    j populate 

done: 
    sb $zero, revstr($t2) #null terminate revstr 

    li $v0, 4 
    la $a0, revstr 
    syscall 
    li $v0, 10 
    syscall