2014-04-20 60 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