嘿伙计们,我需要对所有 i 和 j 执行 C[i][j] = A[i][j] + B[j][i],二维数组中的大小为 16 x 16。
这是我的代码的主要部分(如下所示)。
当我在 SPIM 中运行此代码时,我在“lw $t4, 0($t4) # value of B[j][i]”行收到异常,该异常表示数据/堆栈读取时的地址错误
当我检查每个寄存器中存储的值时,我意识到i == 0x1,但是j达到了0xbf0! (即 3056)
我不知道为什么会发生这种情况,因为我的 j 应该只从 0 增加到 15。帮帮我吧!
la $t0, A # $t0 represents start address of A[i][j]
la $t1, B # $t1 represents start address of B[i][j]
la $t2, C # $t2 represents start address of C[i][j] displacement of A will be the same as C
addi $t3, $zero, 16 # set maximum iteration to be 16
addi $t5, $zero, 0 # set i = 0
addi $t6, $zero, 0 # set j = 0
loopi:
jal loopj # starts inner loopj
addi $t5, $t5, 1 # i++
bne $t3, $t5, loopi # continue loopi if i < 16
j finish
loopj:
sll $t7, $t5, 4
add $t7, $t7, $t6
sll $t7, $t7, 2 # 4 * ((i * 16) + j)
add $t9, $t7, $t0 # address of A[i][j]
lw $t9, 0($t9) # value of A[i][j]
sll $t4, $t6, 4
add $t4, $t4, $t5
sll $t4, $t4, 2 # 4 * ((j * 16) + i)
add $t4, $t4, $t1 # address of B[j][i]
lw $t4, 0($t4) # value of B[j][i]
add $t4, $t4, $t9 # A[i][j] + B[j][i]
add $t7, $t7, $t2 # address of C[i][j]
sw $t4, 0($t7) # store answer into C[i][j]
addi $t6, $t6, 1 # j++
bne $t3, $t6, loopj # continue loopj if j < 16
jr $ra
finish:
最佳答案
您忘记重置j
每次输入 loopi
时都会归零,否则在第一个 loopj
之后loopj
中不会从零开始...
要修复它,您可以移动设置 $t6
的 addi (包含 j
)在标签 loopi
之后:
loopi:
addi $t6, $zero, 0 # set j = 0
jal loopj # starts inner loopj
...
关于arrays - 在 MIPS 中遍历二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13250309/