在MIPS中遍历2D阵列

时间:2012-11-06 11:43:42

标签: arrays loops nested 2d mips

嘿伙计们我需要为所有i和j做C [i] [j] = A [i] [j] + B [j] [i],在2D数组中大小为16 x 16。 / p>

这是我的代码的主要部分(如下所示)。

当我在SPIM中运行此代码时,我收到了行“lw $ t4,0($ t4)#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:     

1 个答案:

答案 0 :(得分:2)

您每次输入j时都忘记将loopi重置为零,否则在loopj后第一个loopj不会从零开始...

要修复此问题,您可以在标签$t6之后移动设置j(包含loopi)的addi:

loopi:
  addi   $t6, $zero, 0     # set j = 0
  jal    loopj             # starts inner loopj
   ...