hh6951 2016-05-25 14:05 采纳率: 0%
浏览 2085
已结题

计算机系统结构DLX指令编写矩阵相乘,要求编写和实现菜单功能

           .data

dat1: .space 64
dat2: .space 64
result: .space 64

Prompt1: .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
beqz

addi 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 5

sub 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,loop2

            addi            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 5

sub 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,f3

add r7,r7,r1 ;j<-j+k,计算矩阵B的当前列的下个元素的索引
j calculate

asign: 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 5

sub 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 ;


  • 写回答

1条回答 默认 最新

  • 普通网友 2016-10-04 18:37
    关注

    指向的内存单元中取出矩阵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,f3

    add r7,r7,r1 ;j<-j+k,计算矩阵B的当前列的下个元素的索引
    j calculate
    asign: 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 5

    sub r8,r8,1
    beqz r8,againChoice
    movfp2i r12,f3
    j loop3
    againChoice:
    add r1,r0,Prompt6
    jal InputUnsigned
    beqz r1,end

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable