矩阵相乘汇编课设.docx
- 文档编号:12520643
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:18
- 大小:85.73KB
矩阵相乘汇编课设.docx
《矩阵相乘汇编课设.docx》由会员分享,可在线阅读,更多相关《矩阵相乘汇编课设.docx(18页珍藏版)》请在冰豆网上搜索。
矩阵相乘汇编课设
矩阵相乘-汇编课设
附件1:
学号:
0120910340318
课程设计
题目
矩阵相乘运算
学院
计算机科学与技术
专业
计算机科学与技术
班级
计算机0903班
姓名
易驰杰
指导教师
张霞
2012
年
1
月
3
日
课程设计任务书
学生姓名:
易驰杰专业班级:
计算机0903班
指导教师:
张霞工作单位:
计算机科学与技术学院
题目:
矩阵相乘运算
初始条件:
理论:
完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:
完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。
具体的设计任务及要求:
1)模拟两个二维数组;
2)实现两个二维数组相乘,并将结果采用矩阵在屏幕上输出;
3)程序采用子程序结构,结构清晰;
4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:
1)《IBM—PC汇编语言程序设计实验教程》实验2.4
2)《IBM—PC汇编语言程序设计(第2版)》例6.11
时间安排:
设计安排一周:
周1、周2:
完成系统分析及设计。
周3、周4:
完成程序调试,和验收。
周5:
撰写课程设计报告。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
1.需求说明………………………………………………………………………………………………………………4
2.开发环境………………………………………………………………………………………………………………4
3.设计说明………………………………………………………………………………………………………………4
4.详细的算法描述……………………………………………………………………………………………….5
5.源程序与执行结果……………………………………………………………………………………………6
5.1源程序……………………………………………………………………………………………………………6
5.2执行结果…………………………………………………………………………………………………………12
5.2.1测试方法…………………………………………………………………………………………………12
5.2.2测试结果…………………………………………………………………………………………………12
5.2.3出错处理…………………………………………………………………………………………………12
6.使用说明………………………………………………………………………………………………………………13
7.总结………………………………………………………………………………………………………………………14
8.参考文献.................................................14
矩阵相乘运算的实现
1需求说明
1.1在这个演示的程序中,将对两个矩阵实现相乘的运算,并在计算机屏幕
终端显示运算的结果。
1.2数据由用户从键盘输入,其相关的数据定义为:
输入的数据的范围要在
00~99之间,如果输入的数据不满足条件的时候提示要求用户重新输入合法的数据。
1.3对两个矩阵相乘的数据结果以3行5列的格式显示出来,能给人一种视觉上的舒服感受。
1.4演示程序以用户和计算机对话的方式执行,即在计算机的终端上的“信息提示”下进行相关的数据的输入和操作。
2开发环境
Windowsxp
VisualASM汇编语言可视化继承开发工具
3设计说明
3.1对于这次设计的矩阵乘法,经过分析后可以发现虽然计算存在规律,但是输入数据没有规律。
所以我就将其设计为一个循环运算的程序,这样我就把没有规律的数据有规律的存放在连续的内存单元中,使数据在循环计算的过程中其地址(位移量)有规律的变化,利用变址寄存器或者基址寄存器来间接的访问它们,每循环一次修改一次寻址寄存器使之指向下一个数据元素。
3.2把输入的数据以矩阵的书写习惯显示出来,故程序在接收输入数据的时候要有一个控制,但是由于数据的输入本身就是一个循环,所以我设计为:
为数据输入添加一个循环,即用一个双存循环来控制矩阵的列数从而可以解决这个问题。
3.3此程序的功能可以分解为三个大的部分,第一部分就是实现数据的接收与保存;第二部分就是实现两个矩阵的乘法运算以及结果的保存;第三部分的功能就是实现对第二部分运算结果的输出显示。
所以在这个程序编写里面可以将对数据的输入和数据的输出分别写一个子功能程序,然后在主程序里面调用就可以使程序易读性和健壮性都得到增强。
4详细的算法描述
4.1对于两个矩阵其计算的实现如下:
所以得到:
c00=a00*b00+a01*b10+a02*b20+a03*b30
c01=a00*b01+a01*b11+a02*b21+a03*b31
…………………………
C24=a20*b04+a21*b14+a22*b24+a23*b34
4.2把a00,a01,a02……顺序放在Matrix1命名的字节变量中,而将b00,b01,b02,b03……存放在以Marix2命名的字节变量中,先假设每一个数据占一个字节,则在数据段里应如下分配内存(定义数据):
Matrix1db12dup(?
)
Matrix2db20dup(?
)
Resultdb15dup(?
)
这样数据的存放就有规律了,只要其中的一个数据的存放地址给定了,其余的各个数据的存放地址就可以随之确定,其间只是相差一个常数。
例如OFFSETMatrix1取的是a00的存放地址(位移量),而a01的存放地址与a00的存放地址的距离是1,a02和a01的存放地址的距离是1,……依次下去。
这样存放的数据就可以使用变址寄存器或者基址寄存器来间接的访问和使用它们。
4.3对于矩阵的相乘的实现,一共有三道循环,第一个最内部的循环就是在定行与定列的相乘时候四个数据的相乘后相加的循环;然后外部的一个循环就是关于定行选择不同列进行相乘的循环;最外面的一个循环就是关于选行的循环。
不过三个循环实现起来的深度有点大,可以把最外面的一道循环写成三次分别调用,这样可以使程序容易实现,看起来更清楚明白。
5源程序与执行结果
5.1源程序如下:
DATASEGMENT;数据段定义
INFORMATION1DB"Pleaseenterthematrix1!
Thearrayis3*4!
$";提示说明
INFORMATION2DB"Pleaseenterthematrix2!
Thearrayis4*5!
$";提示说明
tipsDB'inputanumber(00~99)$'
bufDB?
?
;输入缓冲
M1DB0DH,0AH,"Thearray1:
$";提示信息
M2DB0DH,0AH,"Thearray2:
$"
M3DB0DH,0AH,"Array1*Array2:
$"
matrix1DB12DUP(?
);矩阵1
matrix2DB20DUP(?
);矩阵2
resultDW15DUP(?
);矩阵相乘结果
DATAENDS
enterMACRO
MOVAH,02h
MOVDL,0ah
INT21h
MOVDL,0dh
INT21h
ENDM
CODESEGMENT;定义代码段
mainPROCFAR
ASSUMECS:
CODE,DS:
DATA
begin:
MOVAX,DATA;置DS段初值
MOVDS,AX
LEADX,INFORMATION1;取信息提示地址偏移量
MOVAH,09h;9号功能调用显示提示信息
INT21H
enter
LEADX,m1;提示输入矩阵1
MOVAH,9
INT21H
MOVCX,12
MOVBP,0
enter
k0:
CALLinput
MOVmatrix1[BP],DL
MOVAH,2
MOVDL,20h
INT21h
INCBP
LOOPk0
enter
LEADX,INFORMATION2;取信息提示地址偏移量
MOVAH,09h;9号功能调用显示提示信息
INT21H
enter
MOVBP,0
LEADX,m2;提示输入矩阵2
MOVAH,9
INT21H
enter
XORBP,BP
MOVCX,20
m0:
CALLinput
MOVmatrix2[BP],DL
MOVAH,2
MOVDL,20h
INT21h
INCBP
LOOPm0
XORAX,AX
MOVDI,0
MOVSI,0
MOVBP,0
MOVCX,0
q:
CALLgochengfa;CALLgochengfa
;调用矩阵1某行和矩阵2的列相乘子程序
MOVDI,0
INCCX
MOVSI,CX
CMPCX,5
JNZq
MOVDI,4;incdi
MOVSI,0
MOVCX,5
q1:
CALLgochengfa
MOVDI,4
INCCX
MOVSI,CX
CMPCX,5
JNZq1
MOVDI,8;incdi
MOVSI,0
MOVCX,5
q2:
CALLgochengfa
MOVDI,8
INCCX
MOVSI,CX
CMPCX,5
JNZq2
MOVAH,9
MOVDX,OFFSETM3
INT21H
enter
CALLoutput
MOVAH,01h
INT21h
MOVAH,4CH
INT21H
RET
mainENDP
gochengfaPROCNEAR;矩阵相乘子程序
PUSHCX
PUSHSI
MOVDX,0
MOVCX,4;设置循环次数
again:
MOVAL,matrix1[DI]
MOVAH,0;取矩阵1的偏移地址
MOVBL,matrix2[SI];取矩阵2的偏移地址
MOVBH,0
MULBL
ADDDX,AX
ADDDI,01H
ADDSI,5
LOOPagain
MOVresult[BP],DX
ADDBP,2
POPCX
POPSI
RET
gochengfaENDP
inputPROCNEAR
PUSHAX
PUSHBX
PUSHCX
;check
s:
MOVDI,2
s1:
DECDI
MOVAH,01h
INT21h
CMPAL,20h
JZent
CMPAL,30h
JBs
CMPAL,39h
JAs
MOVbuf[DI],AL
CMPDI,0
JNZs1
DECDI
ent:
CMPDI,1
JZs
INCDI
;count
MOVBL,10
MOVDL,buf[DI]
MOVDH,0
SUBDL,30h
CMPDI,1
JZsave
INCDI
l:
MOVAL,buf[DI]
SUBAL,30h
MULBL
ADDDX,AX
;save
save:
POPCX
POPBX
POPAX
RET
inputENDP
outputPROCNEAR
LEASI,result
MOVCX,3
m:
PUSHCX
MOVCX,5
K:
PUSHCX
MOVDX,0
MOVAX,[SI]
MOVCX,10000
DIVCX
MOVBX,DX
MOVDL,AL
CMPDL,0
JZa
ADDDL,30h
MOVAH,02h
INT21h
a:
MOVDX,0
MOVAX,BX
MOVCX,1000
DIVCX
MOVBX,DX
MOVDL,AL
ADDDL,30h
MOVAH,02h
INT21h
MOVAX,BX
MOVCL,100
DIVCL
MOVBL,AH
MOVDL,AL
CMPDL,0
JZb
ADDDL,30h
MOVAH,2h
INT21h
b:
MOVAL,BL
MOVAH,0
MOVCL,10
DIVCL
MOVBL,AH
MOVDL,AL
ADDDL,30h
MOVAH,02h
INT21h
MOVDL,BL
ADDDL,30h
MOVAH,02h
INT21h
MOVDL,20h
MOVAH,02h
INT21h
POPCX
ADDSI,2
LOOPk
enter
POPCX
LOOPm
RET
outputENDP
CODEENDS
ENDbegin
5.2执行结果
5.2.1测试方法
首先,我们按照要求输入第一个3*4型矩阵(也就是12个数据),假如为123456789101112。
再次按照提示输入第二个4*5型矩阵(也就是20个数据),假如为012340567809101112013141516。
5.2.2测试结果
在输入数据的时候第一次输入的为3*4矩阵,所以输入的数据为12个,当12个数据输入结束后程序自动转行并提示输入的二个矩阵即4*5的矩阵,所以第二次输入的数据是20个,输入数据结束后程序自行进行计算并显示出结果。
执行的结果如下:
5.2.3出错处理
在输入数据的时候,如果输入了不合法的字符,例如字母程序将显示信息提示用户重新输入新的合法数据。
输入的数据只能在0到99的范围内,所以最后的3*5型矩阵最多是4位数。
6使用说明
1.本次程序的使用说明,我们先把源程序拷贝到一个文本文件中,并把它命名为一个汇编程序的格式(*.asm),如yichijie.asm
2.我们在dos中找到masm.exe与link.exe文件所在的文件夹
Masm3>masmyichijie
………
Masm3>linkyichijie
………
Masm3>yichijie
3.进行链接和运行后,会生成相应的.obj和.exe文件,如下所示:
7总结
此次的汇编课程设计是在所有复习考试的时间中完成的,加上因为元旦回家参加姐姐婚礼,所以完成的很是匆忙,在课程设计的这个时间中,我的程序也是错误不断,但是经过反复地调试最终还是苦尽甘来,感觉付出了还是有回报的。
我的课程设计的题目是矩阵的相乘,我的脑海中开始浮现了用C++实现的算法,开始感觉应该是不难的。
可是无奈发现这是汇编的课设,我要想的是用汇编的语言来写程序,心中不免又开始焦急起来,发现我还有许许多多的问题有待解决。
比如:
汇编程序的格式只记得一般都有代码段和数据段,但具体怎么写?
菜单,我要怎么设置字符串变量?
输入、输出操作,用的是哪个寄存器?
比如这些问题,都把我给难住了。
但是程序始终要进行,我就开始静下心来认认真真地思考如何完成。
通过本次实验,我也学会了一种调试程序的方法,那就是“一个函数一个函数单独测试”的方法。
另外一般在编写程序时,我首先应该写出程序的主体框架,然后再进行修饰、完善。
在查错时,我们一定要一条语句一条语句的推敲,绝不能疏忽大意,因为错误的程序往往都是形似而神非,往往错误就在那一两条语句,所以必须仔细。
通过这次的矩阵的相乘的汇编语言设计,我也了解了汇编语言和其他高级语言之间的差别,还是可以对比起来学习的。
我觉得这次汇编语言课程设计让我受益菲浅,是一次重要的,有意思的实践。
让我在这次课程设计中学到了以前在课堂上没能学到的知识。
我相信,我会在以后的学习中更加注重这块的学习。
8参考文献:
IBM—(INTEL8088/80X86)宏汇编语言程序设计
《IBM—PC汇编语言程序设计实验教程》实验2.4
《IBM—PC汇编语言程序设计(第2版)》例6.11
本科生课程设计成绩评定表
班级:
计算机0903 姓名:
易驰杰 学号:
0120910340318
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
200年 月 日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 矩阵 相乘 汇编