如何在MIPS中向数组项添加常量

时间:2016-10-13 15:12:15

标签: assembly mips spim

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

1 个答案:

答案 0 :(得分:0)

lwsw必须使用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/