问题描述
- 计算机系统结构DLX指令编写矩阵相乘,要求编写和实现菜单功能
-
.data
dat1: .space 64
dat2: .space 64
result: .space 64Prompt1: .asciiz "~~~~~~~~~~~~~~~~~~~~~~~martrix multiply~~~~~~~~~~~~~~~~~~~~~n
——————————————————————written by hhq—n
1.请输入矩阵A和矩阵B n
2.输出矩阵A和矩阵B n
3.显示相乘的结果 n
4.重复操作 n
5.退出 n______________________________________________________________n
****************************************************************
Prompt6: .asciiz 请输入你的选择:n"PrintfFormat: .asciiz "%d "
.align 2
PrintfPar: .word PrintfFormat
PrintfValue: .space 4
PrintfFormat1: .asciiz "n"
.align 2
PrintfPar1: .word PrintfFormat1
PrintfValue1: .space 4
PrintfFormat2: .asciiz "Output the mactrix A:n"
.align 2
PrintfPar2: .word PrintfFormat2
PrintfValue2: .space 4
PrintfFormat3: .asciiz "Output the mactrix B:n"
.align 2
PrintfPar3: .word PrintfFormat3
PrintfValue3: .space 4
PrintfFormat4: .asciiz "Output the mactrix C:n"
.align 2
PrintfPar4: .word PrintfFormat4
PrintfValue4: .space 4
.text
.global main
menu :addi r15,r0,Prompt6
beqzaddi r1,r0,Prompt1
jal InputUnsigned ;read uns.-integer into R1
movi2fp f1,r1 ;矩阵A的行数
addi r1,r0,Prompt2
jal InputUnsigned ;read uns.-integer into R1
movi2fp f2,r1 ;矩阵A的列数和B的行数
addi r1,r0,Prompt3
jal InputUnsigned ;read uns.-integer into R1
movi2fp f3,r1 ;矩阵B的列数movfp2i r8,f1 movfp2i r6,f2 multu r4,r6,r8 ;A的元素的个数r4 addi r2,r10,dat1 ;指向A的首地址
loop1:
add r1,r0,Prompt4 ;分别读入A矩阵的元素值
jal InputUnsigned
sb 0(r2),r1 ;存储字节,读入元素
addi r2,r2,1 ;元素个数加1
sub r4,r4,1 ;总个数减1
bnez r4,loop1 ;总个数为不为0跳转输入下一个元素addi r10,r0,0 ;分别独处矩阵A的元素值 addi r2,r10,dat1 ;指向A的首地址 sw PrintfValue2,r1 addi r14,r0,PrintfPar2 trap 5
loopA:
lbu r1,0(r2)
sw PrintfValue,r1
addi r14,r0,PrintfPar ;换行
trap 5
addi r2,r2,1 ;元素个数加1
sub r6,r6,1 ;矩阵A的列数减1
beqz r6,outputA ;矩阵A的列数为0时跳转
j loopA ;否则继续
outputA:
sw PrintfValue1,r1
addi r14,r0,PrintfPar1
trap 5sub r8,r8,1 ;矩阵A的行数减1
beqz r8,countinueB ;为0跳转
movfp2i r6,f2
j loopA
countinueB:
movfp2i r6,f2
movfp2i r12,f3
addi r10,r0,0
multu r4,r6,r12 ;B的元素的个数r4
addi r2,r10,dat2 ;指向B的首地址
loop2:
add r1,r0,Prompt5 ;分别读入矩阵B的元素值
jal InputUnsigned
sb 0(r2),r1
addi r2,r2,1
sub r4,r4,1
bnez r4,loop2addi r10,r0,0 addi r2,r10,dat2 sw PrintfValue3,r1 addi r14,r0,PrintfPar3 trap 5
loopB:
lbu r1,0(r2)
sw PrintfValue,r1
addi r14,r0,PrintfPar
trap 5
addi r2,r2,1
sub r12,r12,1
beqz r12,outputB
j loopB
outputB:
sw PrintfValue1,r1
addi r14,r0,PrintfPar1
trap 5sub r6,r6,1
beqz r6,countinue
movfp2i r12,f3
j loopB
countinue:
addi r11,r0,0 ;表示矩阵C的一个元素的累加器
addi r4,r0,0 ;初始化矩阵C的偏移量
addi r5,r0,0 ;矩阵A当前被扫描的行号line: movi2fp f4,r5 ;判断是否扫描完
ltf f4,f1 ;f4>f1跳转(矩阵A的行是否扫描完)bfpf finish ;是,则跳转结束程序
addi r6,r0,0 ;col,r6表示当前B矩阵的列号column: movi2fp f4,r6
ltf f4,f3 ;col(f3)<f4,矩阵B的列是否扫描完
bfpf leveladd ;是,则跳到矩阵a的下一行movfp2i r1,f2 multu r10,r5,r1 ;i<-l*n r10表示矩阵A当前行的第一个元素的索引 addi r7,r6,0 ;mov col to j(矩阵B某一列的某个元素的索引) addi r11,r0,0 ;temp=0,矩阵C当前的元素值的初始化 addi r9,r5,1 ;r9<-l+1,r9代表矩阵A当前数组中的实际行号(r5的初值为0) movfp2i r1,f2 ;f2是矩阵A的列数 multu r9,r1,r9 ;p<-n*(l+1),r9代表矩阵A当前行中最后一个元素在数组中的索引
calculate: movi2fp f4,r10
movi2fp f9,r9
ltf f4,f9 ;compare i to pz(判断是否计算到当前行的最后一个元素)
bfpf asign ;当前行列相乘完毕,得出结果矩阵C的一个元素(跳转赋值)
addi r1,r10,dat1 ;取矩阵A当前元素在内存区域中的地址
lbu r2,0(r1) ;从r1所指向的内存单元中取出矩阵A当前的元素暂存在r2
addi r1,r7,dat2 ;取矩阵B当前元素在内存区域中的地址
lbu r3,0(r1) ;从r1所指向的内存单元中取出矩阵B当前的元素暂存在r3
multu r1,r2,r3 ;temp1<-dat1[i]+dat2[j]
add r11,r11,r1 ;temp<-temp+temp1,累加到累加器
addi r10,r10,1 ;i++,计算矩阵A当前行的下个元素的索引
movfp2i r1,f3add r7,r7,r1 ;j<-j+k,计算矩阵B的当前列的下个元素的索引
j calculateasign: addi r1,r4,result ;r1表示矩阵C当前的地址
sb 0(r1),r11 ;store result,把新计算出来的元素放入当前内存单元
addi r4,r4,1 ;赋值完一个元素,偏移量自增1
addi r6,r6,1 ;矩阵B的当前列数自增1
j column ;矩阵B新的一列开始leveladd: addi r5,r5,1 ;矩阵A当前行自增1
j line ;矩阵A新的一行开始
finish:
addi r10,r0,0 ;分别读出矩阵C的元素值
movfp2i r8,f1
movfp2i r12,f3
addi r2,r10,result
sw PrintfValue4,r1
addi r14,r0,PrintfPar4
trap 5
loop3:
lbu r1,0(r2)
sw PrintfValue,r1
addi r14,r0,PrintfPar
trap 5
addi r2,r2,1
sub r12,r12,1
beqz r12,outputC
j loop3
outputC:
sw PrintfValue1,r1
addi r14,r0,PrintfPar1
trap 5sub r8,r8,1
beqz r8,againChoice
movfp2i r12,f3
j loop3
againChoice:
add r1,r0,Prompt6
jal InputUnsigned
beqz r1,end
j main
end: trap 0 ;