MIPS汇编中的矩阵乘法出错

时间:2015-02-27 02:10:21

标签: assembly mips matrix-multiplication

我一直在盯着这一段时间,虽然从我得到的错误(无效结果,存储器地址超出界限)中可以清楚地知道我的算法出了问题,但这并不是显而易见的。 。非常感谢任何帮助。

矩阵元素作为半字存储在数组中。请原谅凹痕和任何其他样式错误。我只是希望它能够正常工作。

# matrixMult
#
# Description: This function multiplies
# the two input matrices and places the
# result in matrixC.
#
# register use:
#    a0: address of matrixA
#    a1: address of matrixB
#    a2: address of matrixC
#    t0: counter for row number of matrix C
#    t1: counter for column number of matrix C
#    t2: counter for addend number
#    t3: running total for each element of matrix C
#    t4: number of rows of matrixC
#    t5: number of columns of matrixC
#    t6: number of columns of matrixA/rows of matrixB
#    t7: incrementer for matrix addresses
#    t8: temporary storage
#########################################
matrixMult:
      lw    $t4, 0($s1)         #rows of C
      lw    $t5, 4($s2)         #columns of C
      lw    $t6, 4($s1)         #columns of A/rows of B
      move  $s4, $ra
      la    $a0, matrixA        #loads address of matrixA into a0
      la    $a1, matrixB        #loads address of matrixB into a1
      la    $a2, matrixC            #loads address of matrixC into a2
      addi  $t0, $zero, 0       #initializes t0 to be 0
      forrowsA:
        addi    $t1, $zero, 0       #initializes t1 to be 0
        forcolsB:
        addi    $t2, $zero, 0       #initializes t2 to be 0
          addi    $t3, $zero, 0           #sets the total for this element to 0   
        forcolsA:
          #for matrix A pointer
          mul     $t7, $t5, $t0           # t7 = number of columns * row number
          add     $t7, $t7, $t1           # t7 += column number
          add     $t7, $t7, $t2           # t7 += addend number
          sll     $t7, $t7, 1             # t7 *= 2
          add     $a0, $a0, $t7           # a0 += 2(number of columns * row number + column number)
          lh      $a3, 0($a0)             # integer at memory address a0 saved as a3
          sub     $a0, $a0, $t7           # returns pointer address to the base address

          #for matrix B pointer
          add     $t7, $t2, $t0           # t7 = addend number + row number
          mul     $t7, $t7, $t5           # t7 *= number of columns
          add     $t7, $t7, $t0           # t7 += column number
          sll     $t7, $t7, 1             # t7 *= 2
          add     $a1, $a1, $t7           # a0 += 2(number of columns * row number + column number)
          lh      $t8, 0($a1)             # integer at memory address a0 saved as a3
          sub     $a1, $a1, $t7           # returns pointer address to the base address

          add     $t3, $a3, $t8           #adds A(m,n+x) * B(n+x,m) to the total for C(m,n)

          addi  $t2, $t2, 1         #increments t2
        beq $t2, $t6, nextel    #moves on to next element once one is finished
        jal forcolsA            #repeats totaling loop for an individual element
          nextel:   

          sh      $t3, 0($a2)             #saves the matrix element at the pointer's address
          addi    $a2, $a2, 2             #moves pointer to next element address in matrixC
          addi      $t1, $t1, 1             #increments t1
        beq $t1, $t5, finrow    #moves on to next row once one is finished
          jal   forcolsB            #repeats loop for new element
      finrow:
        addi    $t0, $t0, 1         #increments t0
        beq $t0, $t4, finmult   #ends loop if finished multiplying all elements
        jal forrowsA    

      finmult:
      jr        $s4         # return to the caller  

0 个答案:

没有答案