课程设计
题目矩阵相乘运算
学院计算机科学与技术学院专业计算机科学与技术专业班级
姓名
指导教师
20 年月日
课程设计任务书
学生姓名:专业班级:
指导教师:工作单位:计算机科学与技术学院题目: 矩阵相乘运算
初始条件:
理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具
体要求)
进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。具体的设计任务及要求:
1)模拟两个二维数组;
2)实现两个二维数组相乘,并将结果采用矩阵在屏幕上输出;
3)程序采用子程序结构,结构清晰;
4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:
1)《IBM—PC汇编语言程序设计实验教程》实验2.4
2)《IBM—PC汇编语言程序设计(第2版)》例6.11
时间安排:
设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试,和验收。
周5:撰写课程设计报告。
指导教师签名:年月日
系主任(或责任教师)签名:年月日
目录
1 问题分析 (4)
1.1 具体任务 (4)
1.2 输入 (4)
1.3 输出 (4)
1.4 子程序 (4)
2 程序设计 (4)
2.1 数据段定义 (4)
2.2 回车子程序ENT和输出空格子程序SPA (5)
2.3 提示输入错误 ERROR (5)
2.4 输入子程序 INPUT (5)
2.5 输出子程序 OUTPUT (6)
2.6 矩阵相乘子程序 MULTI (7)
2.7 主程序 (8)
3 调试过程与结果 (8)
3.1 调试过程 (8)
3.2 输出结果 (9)
4 总结 (10)
5 参考文献 (10)
6 附录 (11)
矩阵相乘运算
1 问题分析
1.1 具体任务
(1)模拟两个二维数组;
(2)实现两个二维数组相乘,并将结果采用矩阵在屏幕上输出;
(3)程序采用子程序结构,结构清晰;
(4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
1.2输入
根据题意,该程序输入为两个数组。我将两个数组大小分别设定为3*4和4*5,输入的数字大小范围为0~9。
1.3 输出
该程序输出为一个矩阵。因为输入的矩阵为3*4和4*5,所以输出的矩阵大小为3*5,即以3行5列的形式输出两数组相乘的结果。
1.4 子程序
分析任务,将子程序分成7个,作用分别是输入数据、提示输入错误、回车、空格、矩阵相乘和两个输出。
2 程序设计
2.1 数据段定义
提示输入的语句:(1)"Please enter the matrix1! The matrix1 is 3*4.$"
(2)"Please enter the matrix2! The matrix2 is 4*5.$"
(3)"Please input the number(number is from 0 to 9):$"
提示输入错误语句:"The last number is error! Please input the number again:$"
提示矩阵的数据内容:(1)"The matrix1:$"
(2)"The matrix2:$"
(3)"The result of matrix1*matrix2:$"
定义3个数组X、Y、Z:(1)X DB 12 DUP(?)
(2)Y DB 20 DUP(?)
(3)Z DW 15 DUP(?)
2.2 回车子程序ENT和输出空格子程序SPA
该程序为输出格式调整的子程序。程序如下:
MOV AH,02H
MOV DL,20H
INT 21H
DL中储存的数字根据程序不同进行改变。空格为20H,回车为0DH和0AH。
2.3 提示输入错误ERROR
输出语句“The last number is error! Please input the number again:”
2.4 输入子程序INTPUT
调用函数前先传递参数CL,传递的数据为数组大小。
2.5 输出子程序OUTPUT和OUTP
将存储器中的2进制转换为10进制输出的流程图为:
输出矩阵格式为(其中row为行数col为列数,a[]为数组):OUTPUT (int row, int col, int a[])
1 n←0;
2 for i←1 to row
3 for j←1 to col
4 print(a[n]);
5 n++;
6 SPA();
7 ENT();
2.6 矩阵相乘子程序MULTI
2.7 主程序
主程序过程为:开始→调用输入程序输入数组1→调用输入程序输入数组2→调用矩阵相乘子程序→调用输出程序→结束。
3 调试过程与结果
3.1 调试过程
出现的错误有:
(1)X和Y数组为DB型,相乘后储存结果的数组应为DW型,定义时出错,导致子程序不能执行,提示错误。同样类型的错误还出现在MULTI和OUTPUT子程序中,循环执行储存结果时数组的下标每次只加了1,结果导致程序不能运行或结果出错。
(2)MULTI程序中最外层循环没有及时更新DI的值,导致输出时第二行和第三行第一列的结果出错,显示上一行的数据。
(3)进行乘法运算时将语句写成了MUL AX,BX,同类型的出错还出现在OUTPUT子程序中,将除法语句写成DIV DX,10。这类错误都是因为忘了乘除法的规则。
(4)输出结果时矩阵格式不整齐,将格式进行了调整,输出3位数,不够3位的用0补齐。
3.2 输出结果
(1)
(2)
4 总结
当看到题目是矩阵的乘法,脑海中几乎立即想出了利用C++完成问题的大概结构,便觉得应该不难。但是当真正开始编程的时候才发现汇编编程和C++编程有很大不同,便出现了各种各样的麻烦。
汇编编程因为参数的传递比较麻烦致使数组大小的设定都无法实现灵活性。因为汇编程序的输入的数据为ASCII码,需要进行处理才能被正确储存,所以输入个位数和输入多位数的差别非常大,相较个位数的输入,多位数的输入需要利用结束符去判断一个数据是否已全部输入,还需要对之前的数据进行*10运算,除此之外储存数据用的数组的类型都要扩大,几乎改变了整个程序。为了简便,只好在编程前设定好矩阵的大小为3*4和4*5,结果矩阵为3*5,输入数据的范围为0~9。
在编写子程序时,本想一次性将所有小型的子程序全部编写完整,但在运行时却出现故障,软件也不提示不出是哪里出现了错误,只好将子程序分解,一个一个的进行调试,再合并在一起。这说明了即使是个小的子程序也需要一步一步进行调试,不能想着一步登天。
总之,这次的课程设计让我收益颇丰。
5 参考文献
[1]沈美明,温东婵. IBM—PC汇编语言程序设计(第2版)[M].北京:清华大学出版社,2007.
[2]孙红霞.算法设计与分析[M].武汉:武汉大学出版社,2007.
附录
——源程序
DATAS SEGMENT
IFOR1 DB "Please enter the matrix1! The matrix1 is 3*4.$"
IFOR2 DB 0DH,0AH,"Please enter the matrix2! The matrix2 is 4*5.$"
PM1 DB 0DH,0AH,"Please input the number(number is from 0 to 9):$"
PM2 DB 0DH,0AH,"The last number is error! Please input the number again:$" MA1 DB 0DH,0AH,"The matrix1:$"
MA2 DB 0DH,0AH,"The matrix2:$"
MA3 DB 0DH,0AH,"The result of matrix1*matrix2:$"
X DB 12 DUP(?)
Y DB 20 DUP(?)
Z DW 15 DUP(?)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
MAIN PROC FAR
MOV AX,DATAS
MOV DS,AX
MOV AH,09H
LEA DX,IFOR1
INT 21H
LEA DX,PM1
INT 21H
MOV CL,0CH
LEA SI,X
CALL INPUT
LEA DX,IFOR2
INT 21H
LEA DX,PM1
INT 21H
MOV CL,14H
LEA SI,Y
CALL INPUT
LEA DX,MA1
INT 21H
CALL ENT
MOV CX,0304H
LEA SI,X
CALL OUTP
LEA DX,MA2
CALL ENT
MOV CX,0405H LEA SI,Y
CALL OUTP
CALL MULTI LEA DX,MA3 INT 21H
CALL ENT
CALL OUTPUT MOV AH,4CH INT 21H MAIN ENDP
INPUT PROC NEAR PUSH AX
PUSH CX
PUSH SI
CALL ENT
a1: MOV AH,01H INT 21H
CMP AL,30H JB a3
CMP AL,39H JA a3
SUB AL,30H MOV [SI],AL INC SI
CMP CL,01H JZ a2
CALL SPA
a2: LOOP a1
POP SI
POP CX
POP AX
RET
a3: CALL ERROR JMP a1 INPUT ENDP ERROR PROC NEAR PUSH AX
PUSH DX
LEA DX,PM2 MOV AH,09H INT 21H
POP DX
POP AX
RET
ERROR ENDP OUTP PROC NEAR PUSH AX
MOV AH,02H MOV BL,CL
b1: MOV CL,BL
b2: MOV DL,[SI] ADD DL,30H INT 21H
CALL SPA
INC SI
DEC CL
JNZ b2
CMP CH,01H JZ b3
CALL ENT
b3: DEC CH
JNZ b1
POP AX
RET
OUTP ENDP OUTPUT PROC NEAR LEA SI,Z
MOV CX,3
c1: PUSH CX
MOV CX,5
c2: PUSH CX
MOV AX,[SI] MOV CL,100 DIV CL
MOV BL,AH
MOV DL,AL
ADD DL,30H MOV AH,2H
INT 21h
MOV AL,BL
MOV AH,0
MOV CL,10
DIV CL
MOV BL,AH
ADD DL,30h MOV AH,02h INT 21h
MOV DL,BL ADD DL,30h MOV AH,02h INT 21h
CALL SPA
POP CX
ADD SI,2
LOOP c2
CALL ENT
POP CX
LOOP c1
RET OUTPUT ENDP ENT PROC NEAR PUSH AX
PUSH DX
MOV AH,02H MOV DL,0DH INT 21H
MOV DL,0AH INT 21H
POP DX
POP AX
RET
ENT ENDP
SPA PROC NEAR PUSH AX
PUSH DX
MOV DL,20H MOV AH,02H INT 21H
POP DX
POP AX
RET
SPA ENDP
MULTI PROC NEAR PUSH AX
MOV DI,0
MOV BP,0
MOV DX,0
武汉理工大学《汇编语言程序设计》课程设计说明书
MOV BH,03
d1: MOV CX,0
MOV SI,0
d2: MOV CH,4
d3: MOV AL,X[DI]
MOV BL,Y[SI]
MUL BL
ADD Z[BP],AX
INC DI
ADD SI,5
DEC CH
JNZ d3
ADD BP,2
MOV DI,DX
INC CL
MOV SI,CX
CMP CL,5
JNZ d2
ADD DX,4
MOV DI,DX
DEC BH
JNZ d1
POP AX
RET
MULTI ENDP
CODES ENDS
END MAIN