我是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很陌生,所以不确定发生了什么或什至在哪里看。感谢您的帮助。
答案 0 :(得分:0)
当您这样做:
mul $t4, $t0,$t3 # $t4 = i * 3
您正在计算数组 index [就像在c
中一样)。
但是,在将其添加到数组的基地址之前,需要将该索引转换为 byte 偏移量。也就是说,您必须将其乘以4。可以像在c
中那样向左移动2。
因此,在mul
之后,请执行以下操作:
sll $t4,$t4,2
添加所有索引值之前,必须对所有索引值执行此乘法/移位。
更新:
好吧。我在其中添加了内容,但在“ lw $ t1,0($ s0)”行上仍然出现单词边界错误
您没有显示A
或B
的定义,因此可能存在对齐问题。
当您这样做:
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