计算机系统结构实验报告中南民族大学.docx
《计算机系统结构实验报告中南民族大学.docx》由会员分享,可在线阅读,更多相关《计算机系统结构实验报告中南民族大学.docx(18页珍藏版)》请在冰豆网上搜索。
计算机系统结构实验报告中南民族大学
院系:
专业:
年级:
课程名称:
计算机系统结构
学号:
姓名:
指导教师:
年月日
年级
班级
学号
专业
计算机科学与技术
姓名
题目名称
矩阵相乘
题目内容
1.掌握DLX的流水线运行分析,包括流水线单步执行、每个流水段功能、理解流水线停顿、流水线建立和排空、定向技术。
掌握调整DLX参数,如内存大小、功能单元个数、延迟,分析对程序运行的影响。
2.编写计算矩阵相乘的程序,掌握调试方法。
实
验
结
果
与
分
析
图一.运行结果
(使用%4d来控制输出的齐)
实
验
结
果
与
分
析
图二.寄存器
图三.流水线
实
验
结
果
与
分
析
图四.内存代码
图五.内存查看
实
验
结
果
与
分
析
图六.内存查看结果
图七.内存修改
实
验
结
果
与
分
析
图八.内存修改结果
图九.向量使用结果
图十.未使用向量的结果
实
验
结
果
与
分
析
图十一.程序流程
实
验
结
果
与
分
析
图十二.算法设计图
实
验
结
果
与
分
析
实验结果分析:
本次实验中,学会使用DLX软件,对于其汇编代码有一个整体上的认识。
具体有如下几个小点:
(1)熟悉DLX的仿真硬件系统结构,包括寄存器、计算功能单元、指令系统、流水线。
(2)熟悉DLX仿真软件的功能,包括主要的功能界面。
(3)掌握DLX应用程序的编程和调试技术。
(4)掌握DLX的流水线运行分析,包括流水线单步执行、每个流水段功能、理解流水线停顿、流水线建立和排空、定向技术。
(5)掌握调整DLX参数,如内存大小、功能单元个数、延迟,分析对程序运行的影响
通过编写矩阵相乘来检验掌握的程度,对与在其中出现的问题进行分析,和解决。
能通过单步执行来调试程序,找出出错点和逻辑错误点,并加以改正。
在实验中,几个重点难点。
首先是从主程序中跳InputUnsigned函数中,对于参数的传递要有一个清楚的认识。
其次是,对于系统自陷trap要有一个认识,如trap0是结束、trap3是输入和trap5是输出,当然也有传递的参数也是重点分别是r1和r14。
对于向量的使用也有一个初步的认识,当使用向量时,程序的流水线明显比不适用向量快的多,结果的截图也很清楚的说明了这个问题。
程
序
代
码
.data
;***Promptsforinput;输入提示部分
A:
.space64
B:
.space64
C:
.space64
Prompt1:
.asciiz"输入A矩阵的行:
"
Prompt2:
.asciiz"输入A矩阵的列和B矩阵的列:
"
Prompt3:
.asciiz"输入B矩阵的列:
"
Prompt4:
.asciiz"输入A矩阵元素r:
"
Prompt5:
.asciiz"输入A矩阵元素:
"
;***Dataforprintf-Trap;输出数据设置部分
PrintfFormat:
.asciiz"%d"
.align2
PrintfPar:
.wordPrintfFormat
PrintfValue:
.space4
PrintfFormat1:
.asciiz"\n"
.align2
PrintfPar1:
.wordPrintfFormat1
PrintfFormat_1:
.asciiz"\n"
.align2
PrintfPar_1:
.wordPrintfFormat_1
PrintfValue1:
.space4
PrintfFormat2:
.asciiz"输出A矩阵:
\n"
.align2
PrintfPar2:
.wordPrintfFormat2
PrintfValue2:
.space4
PrintfFormat3:
.asciiz"输出B矩阵:
\n"
.align2
PrintfPar3:
.wordPrintfFormat3
PrintfValue3:
.space4
PrintfFormat4:
.asciiz"输出C矩阵:
\n"
.align2
PrintfPar4:
.wordPrintfFormat4
PrintfValue4:
.space4
.text
.globalmain
程
序
代
码
main:
addir1,r0,Prompt1
jalInputUnsigned
movi2fpf1,r1;矩阵A的行数
addir1,r0,Prompt2
jalInputUnsigned
movi2fpf2,r1;矩阵A的列数,矩阵B的行数
addir1,r0,Prompt3
jalInputUnsigned
movi2fpf3,r1;矩阵B的列数
movfp2ir8,f1
movfp2ir6,f2
multur4,r6,r8;总的矩阵A的元素个数r4
addir2,r10,A;指向A的首地址
loop1:
addr1,r0,Prompt4;分别读入矩阵A的元素值
jalInputUnsigned
sb0(r2),r1;储存字节,读入元素
addir2,r2,1;元素个数加一
subr4,r4,1;总的矩阵元素个数r4减一
bnezr4,loop1;r4不为0时跳转重复输入
addir10,r0,0;分别读出矩阵A的元素值
addir2,r10,A;指向A的首地址
swPrintfValue2,r1
addir14,r0,PrintfPar2
trap5
loopA:
lbur1,0(r2)
swPrintfValue,r1
addir14,r0,PrintfPar;换行
trap5
addir2,r2,1;元素个数加一
subr6,r6,1;矩阵A的列数r6减一
beqzr6,outputA;矩阵A的列数r6等于0时跳到outputA
jloopA;否则继续loopA
outputA:
swPrintfValue1,r1
addir14,r0,PrintfPar1
trap5
subr8,r8,1;矩阵A的行数r8减一
beqzr8,countiuB;矩阵A的行数r8等于0时跳到countiuB
movfp2ir6,f2
程
序
代
码
jloopA;否则继续loopA
countiuB:
addir14,r0,PrintfPar_1
trap5
movfp2ir6,f2
movfp2ir12,f3
addir10,r0,0
multur4,r6,r12;总的矩阵B的元素个数r4
addir2,r10,B;指向B的首地址
loop2:
addir1,r0,Prompt5;分别读入矩阵B的元素值
jalInputUnsigned
sb0(r2),r1;储存字节,读入元素
addir2,r2,1;元素个数加一
subr4,r4,1;总的矩阵元素个数r4减一
bnezr4,loop2;r4不为0时跳转重复输入
addir10,r0,0;分别读出矩阵B的元素值
addir2,r10,B;指向B的首地址
swPrintfValue3,r1
addir14,r0,PrintfPar3
trap5
loopB:
lbur1,0(r2)
swPrintfValue,r1
addir14,r0,PrintfPar;换行
trap5
addir2,r2,1;元素个数加一
subr12,r12,1;矩阵B的列数r12减一
beqzr12,outputB;矩阵B的列数r12等于0时跳到outputB
jloopB;否则继续loopB
outputB:
swPrintfValue1,r1
addir14,r0,PrintfPar1
trap5
subr6,r6,1;矩阵B的行数r6减一
beqzr6,countiue;矩阵B的行数r6等于0时跳到countiu
movfp2ir12,f3
jloopB;否则继续loopB
程
序
代
码
countiue:
addir11,r0,0;temp,表示矩阵C的一个元素的累加器
addir4,r0,0;r初始化矩阵C的偏移量
addir5,r0,0;矩阵A当前被扫描的行号
line:
movi2fpf4,r5;判断是否扫描完
ltff4,f1;f4>f1跳转(矩阵A的行是否扫描完)
bfpffinish;是,则跳转结束程序
addir6,r0,0;col,r6表示当前B矩阵的列号
column:
movi2fpf4,r6
ltff4,f3;col(f3)bfpfleveladd;是,则跳到矩阵A的下一行
movfp2ir1,f2
multur10,r5,r1;i<-l*n,r10表示矩阵A当前行的第一个元素的索引
addir7,r6,0;movcoltoj(矩阵B某一列的某个元素的索引)
addir11,r0,0;temp=0,矩阵C当前的元素值的初始化
addir9,r5,1;r9<-l+1,r9代表矩阵A当前数组中的实际行号(r5的初值为0)
movfp2ir1,f2;f2是矩阵A的列数
multur9,r1,r9;p<-n*(l+1),r9代表矩阵A当前行中最后一个元素在数组中的索引
calculate:
movi2fpf4,r10
movi2fpf9,r9
ltff4,f9;compareitopz(判断是否计算到当前行的最后一个元素)
bfpfasign;当前行列相乘完毕,得出结果矩阵C的一个元素(跳转赋值)
addir1,r10,A;取矩阵A当前元素在内存区域中的地址
lbur2,0(r1);从r1所指向的内存单元中取出矩阵A当前的元素暂存在r2
addir1,r7,B;取矩阵B当前元素在内存区域中的地址
lbur3,0(r1);从r1所指向的内存单元中取出矩阵B当前的元素暂存在r3
multur1,r2,r3;temp1<-A[i]+B[j]
addr11,r11,r1;temp<-temp+temp1,累加到累加器
addir10,r10,1;i++,计算矩阵A当前行的下个元素的索引
movfp2ir1,f3
addr7,r7,r1;j<-j+k,计算矩阵B的当前列的下个元素的索引
jcalculate
程
序
代
码
asign:
addir1,r4,C;r1表示矩阵C当前的地址
sb0(r1),r11;storeC,把新计算出来的元素放入当前内存单元
addir4,r4,1;赋值完一个元素,偏移量自增1
addir6,r6,1;矩阵B的当前列数自增1
jcolumn;矩阵B新的一列开始
leveladd:
addir5,r5,1;矩阵A当前行自增1
jline;矩阵A新的一行开始
finish:
addir10,r0,0;分别读出矩阵C的元素值
movfp2ir8,f1
movfp2ir12,f3
addir2,r10,C
swPrintfValue4,r1
addir14,r0,PrintfPar_1
trap5
addir14,r0,PrintfPar4
trap5
loop3:
lbur1,0(r2)
swPrintfValue,r1
addir14,r0,PrintfPar
trap5
addir2,r2,1
subr12,r12,1
beqzr12,outputC
jloop3
outputC:
swPrintfValue1,r1
addir14,r0,PrintfPar1
trap5
subr8,r8,1
beqzr8,end
movfp2ir12,f3
jloop3;***end
end:
trap0
心
得
体
会
成
绩
评
定
教师签名:
年月日