在MIPS中反转字符串

时间:2014-04-20 19:25:17

标签: mips

尝试让这个程序正常运行,但我无法弄清楚为什么我会一直收到错误。该程序假设输入11个字符,然后输出反转输入。错误如下。

  

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

2 个答案:

答案 0 :(得分:1)

您使用的是32位计算机,应使用4字节倍数的偏移量

=> 4×8 = 32

为你的话语对齐

否则你的指令必须是面向字节的(lb sb lbu等......不是lw ..)

也要纠正这些:

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

答案 1 :(得分: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