简单的MIPS for循环未运行

时间:2018-10-11 01:19:00

标签: loops assembly mips

我是MIP的新手,正在尝试为作业创建for循环。

for (int i=1; i < 16; i+=2) 
{
       A[i] = A[i] + B[3*i]   
} 

使用当前代码,当我尝试加载A [i]的值时,它说获取地址在字边界上未对齐。

这是我的代码:

main:  
    li      $t0, 1              # Starting index of t0=i 
    lw      $s7, aSize          # Loop bound  
    la      $s0, A              # &A
    la      $s6, endA           # &endA
    la      $s1, B              # &B
loop:
    #TODO: Write the loop code
    addi    $t3, $zero, 3   # $t3 = 3
    mul     $t4, $t0,$t3    # $t4 = i * 3
    sll     $t4, $t4, 2     # $t4 into a byte offset

    add     $s1, $s1, $t4   # $s1 = &B[i*3]
    add     $s0, $s0, $t0   # $s0 = &A[i]

    lw      $t1, 0($s0)     # value of A[i]
    lw      $t2, 0($s1)     # value of B[i * 3]

    add     $t2, $t1, $t2   # A[i] + B[i]
    sw      $t2, 0($s0)     # A[i] = A[i] + B[i]
    addi    $s0, $s0, 2
    addi    $s1, $s1, 2
    addi    $t0, $t0, 1     #i++
    bne     $t0, $s7, loop

我对MIP很陌生,所以不确定发生了什么或什至在哪里看。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

当您这样做:

mul     $t4, $t0,$t3    # $t4 = i * 3

您正在计算数组 index [就像在c中一样)。

但是,在将其添加到数组的基地址之前,需要将该索引转换为 byte 偏移量。也就是说,您必须将其乘以4。可以像在c中那样向左移动2。

因此,在mul之后,请执行以下操作:

sll $t4,$t4,2

添加所有索引值之前,必须对所有索引值执行此乘法/移位。


更新:

  

好吧。我在其中添加了内容,但在“ lw $ t1,0($ s0)”行上仍然出现单词边界错误

您没有显示AB的定义,因此可能存在对齐问题。

当您这样做:

add     $s1, $s1, $t4   # $s1 = &B[i*3]

您正在修改&B[0]的原始/基值。那不是你想要的。使用不同的寄存器作为最终地址值(即在整个循环中保持$s1不变)

执行以下操作:

add     $s3, $s1, $t4   # $s3 = &B[i*3]
lw      $t2, 0($s3)     # value of B[i * 3]

以类似的方式调整其他类似的寄存器使用情况(即A数组存在类似的问题)

我已经编码了一个清理后的版本。我尚未组装或测试它,但我认为它会让您更接近。由于我不确定aSize是什么,所以这可能有一个错误的错误[很难在没有整个程序的情况下很难说。]

main:
    li      $t0,1                   # Starting index of t0=i
    lw      $s7,aSize               # Loop bound
    la      $s0,A                   # &A
    la      $s6,endA                # &endA
    la      $s1,B                   # &B
    addi    $t3,$zero,3             # $t3 = 3

loop:
    # TODO: Write the loop code
    mul     $t4,$t0,$t3             # $t4 = i * 3
    sll     $t4,$t4,2               # $t4 into a byte offset
    add     $s3,$s1,$t4             # $s3 = &B[i*3]

    sll     $t4,$t0,2               # $t4 into a byte offset
    add     $s2,$s0,$t4             # $s2 = &A[i]

    lw      $t1,0($s2)              # value of A[i]
    lw      $t2,0($s3)              # value of B[i * 3]

    add     $t2,$t1,$t2             # A[i] + B[i]
    sw      $t2,0($s2)              # A[i] = A[i] + B[i]

    addi    $t0,$t0,2               # i += 2
    bne     $t0,$s7,loop
相关问题