2

皆さん、私はすべての i と j に対して C[i][j] = A[i][j] + B[j][i] を実行する必要があります。サイズは 2D 配列で 16 x 16 です。

これが私のコードの主要部分です (以下を参照)。

このコードを 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:     
4

1 に答える 1

2

j入力するたびにゼロにリセットするのを忘れましたloopi。そうしないと、最初の値loopjがゼロから開始されなくなりloopjます...

これを修正するには、ラベルの後に設定する$t6(保持する) addiを移動します。jloopi

loopi:
  addi   $t6, $zero, 0     # set j = 0
  jal    loopj             # starts inner loopj
   ...
于 2012-11-06T14:21:32.727 に答える