MIPS中的矩阵乘法,数组循环

时间:2015-05-14 08:25:40

标签: assembly matrix mips

第一次在stackoverflow上,所以如果我做错了,请原谅我。我想在MIPS中创建下面的C代码:

   
void mm (int c[][], int a[][], int b[][])
{
    int i, j ,k;
    for (i = 0; i != 4; i = i + 1)
        for (j = 0; j != 4; j = j + 1)
            for (k = 0; k != 4; k = k + 1)
                c[i][j] = c[i][j] + a[i][k] * b[k][j]
}

这是我的MIPS代码:

            .text
main:
j mm

mm:
la $a3, array_A # base address for array_A loaded into $a3
la $a1, array_B # base address for array_B loaded into $a1
la $a2, array_C # base address for array_C loaded into $a2

li $t1, 4 # $t1 = 4 (row-size and loop end)
li $s0, 0 # i = 0; initialize 1st for loop
loop1: 
li $s1, 0 # j = 0; restart 2nd for loop
loop2: 
li $s2, 0 # k = 0; restart 3rd for loop
sll $t2, $s0, 2 # $t2 = i * 4 (size of row of c)
addu $t2, $t2, $s1 # $t2 = i * size(row) + j
sll $t2, $t2, 2 # $t2 = byte offset of [i][j]
addu $t2, $a2, $t2 # $t2 = byte offset of [i][j] 
lw $t4, 0($t2) # $t4 = 2 bytes of c[i][j]
loop3:
sll $t0, $s2, 2 # $t0 = k * 4 (size of row of b)
addu $t0, $t0, $s1 # $t0 = k * size(row) + j
sll $t0, $t0, 2 # $t0 = byte offset off [k][j]
addu $t0, $a1, $t0 # $t0 = byte address of b[k][j]
lw $t5, 0($t0) # $t5 = 2 bytes of b[k][j]
sll $t0, $s0, 2 # $t0 = i * 4 (size of row of a)
addu $t0, $t0, $s2 # $t0 = i * size(row) + k
sll $t0, $t0, 2 # $t0 = byte offset of [i][k]
addu $t0, $a3, $t0 # $t0 = byte address of a[i][k]
lw $t6, 0($t0) # $t6 = 2 bytes of a[i][k]
mul $t5, $t6, $t5 # $t5 = a[i][k] * b[k][j]
add $t4, $t4, $t5 # $t4 = c[i][j] + a[i][k] * b[k][j]
addiu $s2, $s2, 1 # $k = k + 1
bne $s2, $t1, loop3 #if (k != 4) go to loop3
sw $t4, 0($a2) # c[i][j] = $t4 
#----------TEST-------------
li $v0, 1
lw $a0, ($a2)
syscall
li $v0, 4
la $a0, new_row
syscall
#----------TEST-------------

addiu $s1, $s1, 1 # $j = j + 1
addi $a2, $a2, 4
bne $s1, $t1, loop2 # if (j != 4) go to loop2

addiu $s0, $s0, 1 # $i = i + 1
bne $s0, $t1, loop1 # if (i != 32) go to L1 

Exit: 
li $v0, 10 #exits
syscall

    .data 
    array_A: .word 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
    array_B: .word 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
    array_C: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    output_row_string_C: .asciiz "Matrix C Output Row "
    colon_string: .asciiz ": 
    space_string: .asciiz " "
    new_row: .asciiz "\n"
    char_space: .space 2

我期待的输出是所有8的数组。稍后我将重新格式化为4x4矩阵。但是,我已经放置了一个系统调用,其中数组的值正在打印,我得到了一些垃圾:

8
8
8
8
8
8
8
8
8
1126201457
544503160
536885768
8
8
8
8

我正在尝试确保将正确的值相乘并存储,但我不确定数据分配是否存在问题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

####测试代码段后删除行addi $a2, $a2, 4。您正在更改array_C的基地址,我认为这不是您想要的。

此外,数组array_A,array_B和array_C有17个元素而不是16个(4x4),但这不是不良行为的原因。