还剩6页未读,继续阅读
文本内容:
院系计算机科学学院专业计算机科学与技术年级课程名称计算机系统结构学号姓名指导教师年月日年级班级 学号专业 姓名题目名称用DLX汇编语言编写矩阵乘程序__trix.s(元素数据为浮点数) 题目内容对矩阵乘程序__trix.s做如下分析
1.观察程序中出现的数据相关、控制相关和结构相关现象,并指出程序中出现上述现象的指令;
2.指出转移指令在转移成功和不成功时的流水线开销;
3.分别在使用定向技术和不使用定向技术的两种情况下,输入同样的数据,利用Statistics窗口中的统计数字(总的周期数和暂停数),计算定向技术带来的加速比
4.通过DLX模拟器中的configuration窗口,将浮点运算的延迟改为8个时钟周期,重复观察并回答上述的123的问题实验结果与分析实验结果截图如下
1.程序最后的运行结果截图如下此为两个2阶矩阵的相乘,第一个矩阵的数据依次是1234;第二个矩阵的数据依次是5678,最后的运行结果依次是19224350Register图如下各寄存器的参数值如上(写不完时,可另加附页)程序代码
3.流水线图某一流程截图如下
4.时钟周期表最后如下.data;***Promptsforinput;输入提示部分dat1:.spa__64dat2:.spa__64result:.spa__64Prompt1:.asciizInputthe__rtrixAline:Prompt2:.asciizInputthe__rtrixAcolumnandthe__rtrixBline:Prompt3:.asciizInputthe__rtrixBcolumn:Prompt4:.asciizInputthe__rtrixAsnumber:Prompt5:.asciizInputthe__rtrixBsnumber:Prompt6:.asciizThisismyprogram!;***Dataforprintf-Trap;输出数据设置部分PrintfFor__t:.asciiz%d.align2PrintfPar:.wordPrintfFor__tPrintfValue:.spa__4PrintfFor__t1:.asciiz\n.align2PrintfPar1:.wordPrintfFor__t1PrintfValue1:.spa__4PrintfFor__t2:.asciizOutputthe__rtrixA:\n.align2PrintfPar2:.wordPrintfFor__t2PrintfValue2:.spa__4PrintfFor__t3:.asciizOutputthe__rtrixB:\n.align2PrintfPar3:.wordPrintfFor__t3PrintfValue3:.spa__4PrintfFor__t4:.asciizOutputthe__rtrixC:\n.align2PrintfPar4:.wordPrintfFor__t4PrintfValue4:.spa__
4.text.global__in__in:addir1r0Prompt1jalInputUnsignedmovi2fpf1r1;矩阵A的行数addir1r0Prompt2jalInputUnsignedmovi2fpf2r1;矩阵A的列数,矩阵B的行数addir1r0Prompt3jalInputUnsignedmovi2fpf3r1;矩阵B的列数movfp2ir8f1movfp2ir6f2multur4r6r8;总的矩阵A的元素个数r4addir2r10dat1;指向A的首地址loop1:addr1r0Prompt4;分别读入矩阵A的元素值jalInputUnsigned__0r2r1;储存字节,读入元素addir2r21;元素个数加一subr4r41;总的矩阵元素个数r4减一bnezr4loop1;r4不为0时跳转重复输入addir10r00;分别读出矩阵A的元素值addir2r10dat1;指向A的首地址swPrintfValue2r1addir14r0PrintfPar2trap5loopA:lbur10r2swPrintfValuer1addir14r0PrintfPar;换行trap5addir2r21;元素个数加一subr6r61;矩阵A的列数r6减一beqzr6outputA;矩阵A的列数r6等于0时跳到outputAjloopA;否则继续loopAoutputA:swPrintfValue1r1addir14r0PrintfPar1trap5subr8r81;矩阵A的行数r8减一beqzr8countiuB;矩阵A的行数r8等于0时跳到countiuBmovfp2ir6f2jloopA;否则继续loopAcountiuB:movfp2ir6f2movfp2ir12f3addir10r00multur4r6r12;总的矩阵B的元素个数r4addir2r10dat2;指向B的首地址loop2:addir1r0Prompt5;分别读入矩阵B的元素值jalInputUnsigned__0r2r1;储存字节,读入元素addir2r21;元素个数加一subr4r41;总的矩阵元素个数r4减一bnezr4loop2;r4不为0时跳转重复输入addir10r00;分别读出矩阵B的元素值addir2r10dat2;指向B的首地址swPrintfValue3r1addir14r0PrintfPar3trap5loopB:lbur10r2swPrintfValuer1addir14r0PrintfPar;换行trap5addir2r21;元素个数加一subr12r121;矩阵B的列数r12减一beqzr12outputB;矩阵B的列数r12等于0时跳到outputBjloopB;否则继续loopBoutputB:swPrintfValue1r1addir14r0PrintfPar1trap5subr6r61;矩阵B的行数r6减一beqzr6countiue;矩阵B的行数r6等于0时跳到countiumovfp2ir12f3jloopB;否则继续loopBcountiue:addir11r00;temp,表示矩阵C的一个元素的累加器addir4r00;r初始化矩阵C的偏移量addir5r00;矩阵A当前被扫描的行号line:movi2fpf4r5;判断是否扫描完ltff4f1;f4f1跳转(矩阵A的行是否扫描完)bfpffinish;是,则跳转结束程序addir6r00;col,r6表示当前B矩阵的列号column:movi2fpf4r6ltff4f3;col(f3)f4,矩阵B的列是否扫描完bfpfleveladd;是,则跳到矩阵a的下一行movfp2ir1f2multur10r5r1;i-l*n,r10表示矩阵A当前行的第一个元素的索引addir7r60;movcoltoj(矩阵B某一列的某个元素的索引)addir11r00;temp=0,矩阵C当前的元素值的初始化addir9r51;r9-l+1,r9代表矩阵A当前数组中的实际行号(r5的初值为0)movfp2ir1f2;f2是矩阵A的列数multur9r1r9;p-n*l+1,r9代表矩阵A当前行中最后一个元素在数组中的索引calculate:movi2fpf4r10movi2fpf9r9ltff4f9;compareitopz(判断是否计算到当前行的最后一个元素)bfpfasign;当前行列相乘完毕,得出结果矩阵C的一个元素(跳转赋值)addir1r10dat1;取矩阵A当前元素在内存区域中的地址lbur20r1;从r1所指向的内存单元中取出矩阵A当前的元素暂存在r2addir1r7dat2;取矩阵B当前元素在内存区域中的地址lbur30r1;从r1所指向的内存单元中取出矩阵B当前的元素暂存在r3multur1r2r3;temp1-dat1[i]+dat2[j]addr11r11r1;temp-temp+temp1,累加到累加器addir10r101;i++,计算矩阵A当前行的下个元素的索引movfp2ir1f3addr7r7r1;j-j+k,计算矩阵B的当前列的下个元素的索引jcalculateasign:addir1r4result;r1表示矩阵C当前的地址__0r1r11;storeresult,把新计算出来的元素放入当前内存单元addir4r41;赋值完一个元素,偏移量自增1addir6r61;矩阵B的当前列数自增1jcolumn;矩阵B新的一列开始leveladd:addir5r51;矩阵A当前行自增1jline;矩阵A新的一行开始finish:addir10r00;分别读出矩阵C的元素值movfp2ir8f1movfp2ir12f3addir2r10resultswPrintfValue4r1addir14r0PrintfPar4trap5loop3:lbur10r2swPrintfValuer1addir14r0PrintfPartrap5addir2r21subr12r121beqzr12outputCjloop3outputC:swPrintfValue1r1addir14r0PrintfPar1trap5subr8r81beqzr8choi__movfp2ir12f3jloop3;***endchoi__:addr1r0Prompt6;是否重复本次运行操作jalInputUnsignedbeqzr1end;若为0则结束运行j__in;否则则重复执行end:trap0心得体会成绩评定教师签名年月日。