Когда вы делаете:
mul $t4, $t0,$t3 # $t4 = i * 3
Вы вычисляете массив index [как в c
].
Но, прежде чем вы сможете добавитьчто в базовый адрес массива, вам нужно преобразовать этот индекс в байт смещение.То есть вы должны умножить его на 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