文档库 最新最全的文档下载
当前位置:文档库 › 汇编课程设计 矩阵的乘法运算

汇编课程设计 矩阵的乘法运算

课程设计

题目矩阵相乘运算

学院计算机科学与技术学院专业计算机科学与技术专业班级

姓名

指导教师

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

相关文档