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

问题描述

计算机系统结构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 ;


时间: 2024-12-01 12:31:51

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

计算机系统结构,DLX处理器程序设计的问题

问题描述 计算机系统结构,DLX处理器程序设计的问题 计算机系统结构课实验,让使用 ** DLX ** 写一段汇编代码,完成 双精度浮点 的 除法 运算,并输出结果. 新手不太会往这里码代码,可能下面代码格式有点乱.请谅解TAT 然后,我和同学照实验指导书给出的例子,照猫画虎做出的代码大致是: .data Prompt1: .asciiz "First Number:" Prompt2: .asciiz "Second Number: " PrintfFormat:

[算法系列之十五]Strassen矩阵相乘算法

引言 Strassen矩阵乘法是一种典型的分治算法.目前为止,我们已经见过一些分治策略的算法了,例如归并排序和Karatsuba大数快速乘法.现在,让我们看看分治策略的背后原理是什么. 同动态规划不同,在动态规划中,为了得到最终的答案,我们需要把一个大的问题"展开"为几个子问题("expand" the solutions of sub-problems),但是在这里,我们会更多的谈到如何把一些子解决方案组合到一起.对于一般问题,他们的子问题的解决方案是对等的,他们

用数组实现矩阵相乘的问题

问题描述 矩阵相乘有点迷糊 帮忙做下,越简单越好,能实现就OK 设计和编写代表矩阵的Matrix类.该类包括矩阵行列数变量int rows和int cols,矩阵数据数组double data[][],构造方法Matrix().Matrix(int rows,int cols).Matrix(int rows,int cols,double data[][]),获取某元素值的方法getData(int row,int col),设置某元素值的方法setData(int row,int col,d

矩阵相乘

在R中矩阵相乘使用%*%运算符号. 矩阵相乘必须满足 : 左边的矩阵列数和右边的矩阵行数相等.  例如m行,n列的矩阵和n行p列的矩阵可以相乘, 并且得到的是m行,p列的矩阵. 那么结果矩阵上的每个点的数据是怎么计算来的呢? 例如 :  [2,3]  即第二行第三列这个点. 计算方法 : 左边矩阵的第2行和右边矩阵的第3列的每个元素相乘, 然后把所有乘积相加的结果, 例子 :  > x <- matrix(data = c(1:6), nrow = 2, ncol = 3, byrow = T

eigen-用Eigin做矩阵相乘,计算时间太久是因为什么?

问题描述 用Eigin做矩阵相乘,计算时间太久是因为什么? 这是代码: int main() { time_t start,end,time; MatrixXf M=MatrixXf::Random(50,50); MatrixXf N=MatrixXf::Random(50,50); start=clock(); MatrixXf S=M*N; end=clock(); time=end-start; cout<<"S=n"<<S<<endl; c

java编写万年历,如何编写换行语句

问题描述 java编写万年历,如何编写换行语句 新手小白,才学到循环语句,就要求写一万年历,不知道如何写日历中的换行语句,求帮助 解决方案 ........换行语句,第一次听说,这个应该不算是逻辑语句吧,是你要根据自己的需求来计算位置吧.比如假设每个单元宽度和高度是x和y,那么 第一行第一个位置是(0,0),那么第一行第十个就是(10x,0),然后第二行第一个就是(0,y).这样不就换行显示了么? for(int i ; i < row ; i++){ for(int j; j< column

ZED Board从入门到精通系列(八)——Vivado HLS实现矩阵相乘

终于到了HLS部分.HLS是High Level Synthesis的缩写,是一种可以将高级程序设计语言C,C++,SystemC综合为RTL代码的工具.   生产力的发展推动了设计模式.在电子技术初级阶段,人们关注的是RLC电路,通过建立微分方程求解电路响应.门级电路是对RLC的初步封装,人们进而采用布尔代数.卡诺图进行电路设计与分析.之后随着集成电路进一步发展,门电路可以集成为寄存器.触发器.ROM等宏单元,设计工具也变得更为高度模块化.算法级别的电路设计,则一直没有特别好的工具,直到出现了

深入理解计算机系统结构——并发编程

并发编程 如果逻辑控制流在实际上重叠,那么它们就是并发的,这种常见的现象称为并发,出现在计算机系统的许多不同层面上. 应用级并发在其他情况下也是很有用的: 访问慢速I/O设备. 与人交互. 通过推迟工作以降低延迟. 服务多个网络客户端. 在多核机器上进行并行计算. 使用应用级并发的应用程序称为并发程序.现代操作系统提供了三种基本的构造并发程序的方法: 进程.用这种方法,每个逻辑控制流都是一个进程,由内核来调度和维护.因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通

深入理解计算机系统结构——链接

链接是将各种各样代码和数据部门收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可执行于加载时,也就是在程序被加载器加载的存储器并执行时:甚至执行于运行时,由应用程序来执行. 1 编译器驱动程序 考虑如下的两个源文件:main.c和swap.c. main.c void swap(); int buf[2]={1,2}; int main() { swap(); return 0; } swap.c ext