院系:专业:年级:课程名称:计算机系统结构学号:姓名:指导教师:年月日年级班级?学号专业?姓名题目名称用DLX汇编语言编写矩阵相乘程序题目内容1、掌握DLX应用程序的编程和调试技术。掌握DLX的流水线运行分析,包括流水线单步执行、每个流水段功能、理解流水线停顿、流水线建立和排空、定向技术。掌握调整DLX参数,如内存大小、功能单元个数、延迟,分析对程序运行的影响。2、编写计算矩阵相乘的程序,掌握调试方法。实验结果与分析实验结果:(1)先输入矩阵A和矩阵B的行数和列数,再输入矩阵A的各元素数值,显示矩阵A;再输入矩阵B的各元素数值,显示矩阵B;最后进行矩阵相乘,输出结果矩阵C。(2)各矩阵元素均赋初值为0。实验结果与分析(3)显示流水线的部分时空图。实验结果分析:通过调用所编写的矩阵相乘的DLX汇编程序和程序,运行WINDLX环境平台,加载好所需项后,根据提示输入两个矩阵的行和列的值及矩阵的各行各列所对应的元素数值,并显示要进行计算的两个矩阵,以便进行矩阵相乘,运行结束后自动显示得出矩阵的结果,本次实验可以重复运行进行矩阵相乘。实验同时亦可查看流水线分布及DLX的流水线运行分析,包括流水线单步执行、每个流水段功能、理解流水线停顿、流水线建立和排空、定向技术。?通过Prompt语句显示提示语句,输入所需数据,其计算结果一个一个地存放于内存中,利用PrintfPar语句输出结果。利用寄存器存放输入的矩阵元素和计算的结果,并将其在整形与浮点类型间进行转化。(写不完时,可另加附页。)程序代码程序代码程序代码程序代码程序代码;***********multiplyanarraytoanarray*************;************************;------------------------------------------------------------------------;Programbeginsatsymbolmain;requiresmoduleINPUT;Readtwoarrays,calculatethemultiplitionoftwoarrays;andwritetheresulttostdout;------------------------------------------------------------------------.data;***Promptsforinput;输入提示部分dat1:.space64dat2:.space64result:.space64Prompt1:.asciizInputthemartrixAline:Prompt2:.asciizInputthemartrixAcolumnandthemartrixBline:Prompt3:.asciizInputthemartrixBcolumn:Prompt4:.asciizInputthemartrixA'snumber:Prompt5:.asciizInputthemartrixB'snumber:Prompt6:.asciizDoyouwantagain(no=0):;***Dataforprintf-Trap;输出数据设置部分PrintfFormat:.asciiz%d.align2PrintfPar:.wordPrintfFormatPrintfValue:.space4PrintfFormat1:.asciiz\n.align2PrintfPar1:.wordPrintfFormat1PrintfValue1:.space4PrintfFormat2:.asciizOutputthemartrixA:\n.align2PrintfPar2:.wordPrintfFormat2PrintfValue2:.space4PrintfFormat3:.asciizOutputthemartrixB:\n.align2PrintfPar3:.wordPrintfFormat3PrintfValue3:.space4PrintfFormat4:.asciizOutputthemartrixC:\n.align2PrintfPar4:.wordPrintfFormat4PrintfValue4:.space4.text.globalmainmain:addir1,r0,Prompt1jalInputUnsignedmovi2fpf1,r1;矩阵A的行数addir1,r0,Prompt2jalInputUnsignedmovi2fpf2,r1;矩阵A的列数,矩阵B的行数addir1,r0,Prompt3jalInputUnsignedmovi2fpf3,r1;矩阵B的列数movfp2ir8,f1movfp2ir6,f2multur4,r6,r8;总的矩阵A的元素个数r4addir2,r10,dat1;指向A的首地址loop1:addr1,r0,Prompt4;分别读入矩阵A的元素值jalInputUnsignedsb0(r2),r1;储存字节,读入元素addir2,r2,1;元素个数加一subr4,r4,1;总的矩阵元素个数r4减一bnezr4,loop1;r4不为0时跳转重复输入addir10,r0,0;分别读出矩阵A的元素值addir2,r10,dat1;指向A的首地址swPrintfValue2,r1addir14,r0,PrintfPar2trap5loopA:lbur1,0(r2)swPrintfValue,r1addir14,r0,PrintfPar;换行trap5addir2,r2,1;元素个数加一subr6,r6,1;矩阵A的列数r6减一beqzr6,outputA;矩阵A的列数r6等于0时跳到outputAjloopA;否则继续loopAoutputA:swPrintfValue1,r1addir14,r0,PrintfPar1trap5subr8,r8,1;矩阵A的行数r8减一beqzr8,countiuB;矩阵A的行数r8等于0时跳到countiuBmovfp2ir6,f2jloopA;否则继续loopAcountiuB:movfp2ir6,f2movfp2ir12,f3addir10,r0,0multur4,r6,r12;总的矩阵B的元素个数r4addir2,r10,dat2;指向B的首地址loop2:addir1,r0,Prompt5;分别读入矩阵B的元素值jalInputUnsignedsb0(r2),r1;储存字节,读入元素addir2,r2,1;元素个数加一subr4,r4,1;总的矩阵元素个数r4减一bnezr4,loop2;r4不为0时跳转重复输入addir10,r0,0;分别读出矩阵B的元素值addir2,r10,dat2;指向B的首地址swPrintfValue3,r1addir14,r0,PrintfPar3trap5loopB:lbur1,0(r2)swPrintfValue,r1addir14,r0,PrintfPar;换行trap5addir2,r2,1;元素个数加一subr12,r12,1;矩阵B的列数r12减一beqzr12,outputB;矩阵B的列数r12等于0时跳到outputBjloopB;否则继续loopBoutputB:swPrintfValue1,r1addir14,r0,PrintfPar1trap5subr6,r6,1;矩阵B的行数r6减一beqzr6,countiue;矩阵B的行数r6等于0时跳到countiumovfp2ir12,f3jloopB;否则继续loopBcountiue:addir11,r0,0;temp,表示矩阵C的一个元素的累加器addir4,r0,0;r初始化矩阵C的偏移量addir5,r0,0;矩阵A当前被扫描的行号line:movi2fpf4,r5;判断是否扫描完ltff4,f1;f4f1跳转(矩阵A的行是否扫描完)bfpffinish;是,则跳转结束程序addir6,r0,0;col,r6表示当前B矩阵的列号column:movi2fpf4,r6ltff4,f3;col(f3)f4,矩阵B的列是否扫描完bfpfleveladd;是,则跳到矩阵a的下一行movfp2ir1,f2multur10,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,r10movi2fpf9,r9ltff4,f9;compareitopz(判断是否计算到当前行的最后一个元素)bfpfasign;当前行列相乘完毕,得出结果矩阵C的一个元素(跳转赋值)addir1,r10,dat1;取矩阵A当前元素在内存区域中的地址lbur2,0(r1);从r1所指向的内存单元中取出矩阵A当前的元素暂存在r2addir1,r7,dat2;取矩阵B当前元素在内存区域中的地址lbur3,0(r1);从r1所指向的内存单元中取出矩阵B当前的元素暂存在r3multur1,r2,r3;temp1-dat1[i]+dat2[j]addr11,r11,r1;temp-temp+temp1,累加到累加器addir10,r10,1;i++,计算矩阵A当前行的下个元素的索引movfp2ir1,f3addr7,r7,r1;j-j+k,计算矩阵B的当前列的下个元素的索引jcalculateasign:addir1,r4,result;r1表示矩阵C当前的地址sb0(r1),r11;storeresult,把新计算出来的元素放入当前内存单元addir4,r4,1;赋值完一个元素,偏移量自增1addir6,r6,1;矩阵B的当前列数自增1jcolumn;矩阵B新的一列开始leveladd:addir5,r5,1;矩阵A当前行自增1jline;矩阵A新的一行开始finish:addir10,r0,0;分别读出矩阵C的元素值movfp2ir8,f1movfp2ir12,f3addir2,r10,resultswPrintfValue4,r1addir14,r0,PrintfPar4trap5loop3:lbur1,0(r2)swPrintfValue,r1addir14,r0,PrintfPartrap5addir2,r2,1subr12,r12,1beqzr12,outputCjloop3outputC:swPrintfValue1,r1addir14,r0,PrintfPar1trap5subr8,r8,1beqzr8,choicemovfp2ir12,f3jloop3;***endchoice:addr1,r0,Prompt6;是否重复本次运行操作jalInputUnsignedbeqzr1,end;若为0则结束运行jmain;否则则重复执行end:trap0心得体会通过本次系统结构实验,我对DLX的流水线运行分析,包括流水线单步执行、每个流水段功能、理解流水线停顿、流水线建立和排空、定向技术等内容有了很好的掌握;知道其运行情况,能够根据程序段分析其运行位置及存储情况,会用内存地址等查看所输入数值的存储,在寄存器中找到相应输入数值,理解其运行断点的含义;我还会观察程序中出现的数据相关、控制相关和结构相关现象,并能找出程序中出现上述现象的指令;我对DLX指令的语法和语义也有一定了解,会编写简单程序解决基本问题,对课堂所学知识有了更深入的理解,在以后的学习中要勤于动手,将所学知识在实践中运用,以便理解更清晰、透彻。成绩评定教师签