尝试让这个程序正常运行,但我无法弄清楚为什么我会一直收到错误。该程序假设输入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
答案 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