.data
'按行大顺序'
mA: .float 1.5,2.5,3.5,4.5
'按行大顺序'
mB: .float 5.5,6.5,7.5,8.5
''结果矩阵mC中的4个元素,每个4个字节'
mC: .float 0,0,0,0
space: .asciiz " "
.text
'a3存储结果矩阵的字节大小mC'
la $a3,mC
'a1存储i / p矩阵mA'
la $a1,mA
la $a2,mB
'a'
l.s $f1, 0($a1)
'b'
l.s $f2, 4($a1)
'c'
l.s $f3, 8($a1)
'd'
l.s $f4, 12($a1)
l.s $f5, 0($a2)
'e'
l.s $f6, 4($a2)
'f'
l.s $f7, 8($a2)
'g'
l.s $f8, 12($a2)
'这里使用Strassen算法进行矩阵乘法
add.s $f0,$f1,$f4 #a+d
add.s $f9,$f5,$f8 #e+h
mul.s $f0, $f0,$f9 # -p5
sub.s $f9,$f7,$f5 #g-e
mul.s $f9,$f4,$f9 #d(g-e) - p4
add.s $f10,$f1,$f2 # a+b
mul.s $f10,$f8,$f10 #h(a+b) - p2
sub.s $f11,$f2,$f4 # (b-d)
add.s $f12,$f7,$f8 #(g+h)
mul.s $f13,$f11,$f12 #p6
add.s $f11, $f0,$f9 # p5+p4
add.s $f12,$f11,$f13 #p5+p4+p6
sub.s $f11,$f12,$f10 #p5+p4+p6-p2
'“存储在结果矩阵的第一个单元格中的值'
s.s $f11,0($a3)
#... p1,p2
sub.s $f13,$f6,$f8 # (f-h)
mul.s $f12,$f13,$f1 #a(f-h) $f12 -p1
add.s $f13, $f12,$f10 # (p1+p2)
s.s $f13, 4($a3)
add.s $f14,$f3,$f4 # c+d
mul.s $f15,$f14,$f5 #e(c+d)
add.s $f14,$f15,$f9 #p3+p4
s.s $f14,8($a3)
sub.s $f16,$f1,$f3 '(a-c)'
add.s $f17,$f5,$f6 '(e+f)'
mul.s $f16,$f16,$f17 '(a-c)*(e+f) - p7'
add.s $f17,$f12,$f0 '(p1+p5)'
sub.s $f18,$f17,$f15 '(p1+p5-p3)'
sub.s $f17,$f18,$f16 '(p1+p5-p3-p7)'
s.s $f17,12($a3)
'打印结果矩阵'li $ t1,0
loop: beq $t1, 4, exit
'在此处输入您的代码以打印结果矩阵'
j loop
exit:
li $v0,10
syscall
您不能循环访问寄存器(除非完全展开,否则;它们不可索引。没有“间接”方式使用一个(整数)寄存器中的数字来选择要读取的FP寄存器。
如果要遍历它们,则必须将这些值存储回内存中。