C代码就是这个
function foo()
{
int i,a[10],b[10],c=2;
for (i=0; i<10; i++) a[i] = b[i] + c;
printf (“%d\n”, i);
}
这是我的mips代码:
.data
a: .space 10
n: .word 1
m: .word 10
.text
main:
la $t1, a
la $t2, a
la $s3, n
lw $t5, 0($t1)
lw $t6, 0($t2)
lw $t3, 0($s3)
lw $t4, 4($s3)
add $t0, $0, $0
foo:
beq $t0, $t4, done
add $t0, $t0, $t3
add $s5, $t3, $t3
lw $s1, 0($t5)
lw $s2, 0($t6)
add $s1, $s1, $s5
sw $s1, 0($t5)
addi $t5, $t5, 4
addi $t6, $t6, 4
j foo
done:
li $v0,1
move $a0,$t0
syscall
jr $ra
当我在qtspim中运行时,会出现以下错误消息:
Exception occurred at PC=0x00400030
Bad address in data/stack read: 0x00000000
Attempt to execute non-instruction at 0x80000180
答案 0 :(得分:0)
lw
和sw
必须使用4的倍数的地址。这是&#34;未对齐地址的来源&#34;错误。但是,地址是&#34; 2&#34;并没有在0x10010000的愤怒表明你仍然混淆你的&#34;指针&#34;用你的&#34;变量&#34;。试试这个:使用寄存器$ t0 - $ t4仅用于&#34;数据值&#34;,并使用寄存器$ t5- $ t8作为内存地址。这可以帮助您避免混淆。此外,我发现使用MARS比使用SPIM更容易逐步调试汇编代码。 (http://courses.missouristate.edu/KenVollmar/mars/)