院 系: 专 业: 年 级: 课程名称: 计算机系统结构 学 号: 姓 名: 指导教师:
年 月 日
年级 班级 专业 ?学号 ?姓名 题目用DLX汇编语言编写矩阵相乘程序 名称 题目内容 1、掌握DLX应用程序的编程和调试技术。掌握DLX的流水线运行分析,包括流水线单步执行、每个流水段功能、理解流水线停顿、流水线建立和排空、定向技术。掌握调整DLX参数,如内存大小、功能单元个数、延迟,分析对程序运行的影响。 2、编写计算矩阵相乘的程序,掌握调试方法。 实 验 实验结果: 结 (1)先输入矩阵A和矩阵B的行数和列数,再输入矩阵A的各元素数值,显果 示矩阵A;再输入矩阵B的各元素数值,显示矩阵B;最后进行矩阵相乘,输出结果矩阵C。 与 (2)各矩阵元素均赋初值为0。 分 析 (3)显示流水线的部分时空图。 实 实验结果分析: 验 通过调用所编写的矩阵相乘的DLX汇编程序和input.s程序,运行WINDLX环境平台,加载好所需项后,根据提示输入两个矩阵的行和列的值及结 矩阵的各行各列所对应的元素数值,并显示要进行计算的两个矩阵,以便进行矩阵相乘,运行结束后自动显示得出矩阵的结果,本次实验可以重复运行进行矩阵相乘。实验同时亦可查看流水线分布及DLX的流水线运行分析,包果 与 括流水线单步执行、每个流水段功能、理解流水线停顿、流水线建立和排空、定向技术。?通过Prompt语句显示提示语句,输入所需数据,其计算结果一个一个地存放于内存中,利用PrintfPar语句输出结果。利用寄存器存放输分 析 入的矩阵元素和计算的结果,并将其在整形与浮点类型间进行转化。 (写不完时,可另加附页。) 程 ;***********multiply an array to an array ************* 序 ;*********** ************* 代 ;------------------------------------------------------------------------ 码 ; Program begins at symbol main 程 ; requires module INPUT 序 ; Read two arrays, calculate the multiplition of two arrays 代 ; and write the result to stdout 码 ;----------------------------------------------------------------程 -------- 序 .data 代 ;*** Prompts for input ;输入提示部分 码 dat1: .space 程 dat2: .space 序 result: .space 代 Prompt1: .asciiz \"Input the martrixA line:\" 码 Prompt2: .asciiz \"Input the martrixA column and the martrixB line: \" 程 Prompt3: .asciiz \"Input the martrixB column:\" 序 Prompt4: .asciiz \"Input the martrixA's number:\" 代 Prompt5: .asciiz \"Input the martrixB's number:\" 码 Prompt6: .asciiz \"Do you want again (no=0):\" ;*** Data for printf-Trap ;输出数据设置部分 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 martrixA:\\n \" .align 2 PrintfPar2: .word PrintfFormat2 PrintfValue2: .space 4 PrintfFormat3: .asciiz \"Output the martrixB:\\n \" .align 2 PrintfPar3: .word PrintfFormat3 PrintfValue3: .space 4 PrintfFormat4: .asciiz \"Output the martrixC:\\n \" .align 2 PrintfPar4: .word PrintfFormat4 PrintfValue4: .space 4 .text .global main main: addi r1,r0,Prompt1 jal InputUnsigned movi2fp f1,r1 ;矩阵A的行数 addi r1,r0,Prompt2 jal InputUnsigned movi2fp f2,r1 ;矩阵A的列数,矩阵B的行数 addi r1,r0,Prompt3 jal InputUnsigned 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 ;元素个数加一 sub r4,r4,1 ;总的矩阵元素个数r4减一 bnez r4,loop1 ;r4不为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 ;元素个数加一 sub r6,r6,1 ;矩阵A的列数r6减一 beqz r6,outputA ;矩阵A的列数r6等于0时跳到outputA j loopA ;否则继续loopA outputA: sw PrintfValue1,r1 addi r14,r0,PrintfPar1 trap 5 sub r8,r8,1 ;矩阵A的行数r8减一 beqz r8,countiuB ;矩阵A的行数r8等于0时跳到countiuB movfp2i r6,f2 j loopA ;否则继续loopA countiuB: movfp2i r6,f2 movfp2i r12,f3 addi r10,r0,0 multu r4,r6,r12 ;总的矩阵B的元素个数r4 addi r2,r10,dat2 ;指向B的首地址 loop2: addi r1,r0,Prompt5 ;分别读入矩阵B的元素值 jal InputUnsigned sb 0(r2),r1 ;储存字节,读入元素 addi r2,r2,1 ;元素个数加一 sub r4,r4,1 ;总的矩阵元素个数r4减一 bnez r4,loop2 ;r4不为0时跳转重复输入 addi r10,r0,0 ;分别读出矩阵B的元素值 addi r2,r10,dat2 ;指向B的首地址 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 ;矩阵B的列数r12减一 beqz r12,outputB ;矩阵B的列数r12等于0时跳到outputB j loopB ;否则继续loopB outputB: sw PrintfValue1,r1 addi r14,r0,PrintfPar1 trap 5 sub r6,r6,1 ;矩阵B的行数r6减一 beqz r6,countiue ;矩阵B的行数r6等于0时跳到countiu movfp2i r12,f3 j loopB ;否则继续loopB countiue: addi r11,r0,0 ;temp,表示矩阵C的一个元素的累加器 addi r4,r0,0 ;r 初始化矩阵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)