汇编语言矩阵相乘课程设计附源代码.docx
- 文档编号:29922959
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:29
- 大小:301.39KB
汇编语言矩阵相乘课程设计附源代码.docx
《汇编语言矩阵相乘课程设计附源代码.docx》由会员分享,可在线阅读,更多相关《汇编语言矩阵相乘课程设计附源代码.docx(29页珍藏版)》请在冰豆网上搜索。
汇编语言矩阵相乘课程设计附源代码
汇编语言矩阵相乘课程设计(附源代码)
华北科技学院
课程设计说明书
班级:
姓名:
学号:
课程名称:
汇编语言课程设计
课设时间:
2006-12-05至2006-12-16
成绩评定:
1、工作量:
A(),B(),C(),D(),F()
2、难易度:
A(),B(),C(),D(),F()
3、答辩情况:
基本操作:
A(),B(),C(),D(),F()
代码理解:
A(),B(),C(),D(),F()
4、报告规范度:
A(),B(),C(),D(),F()
5、学习态度:
A(),B(),C(),D(),F()
总评成绩:
指导教师:
一.课程设计的目的、任务
1.课程设计的目的:
使学生综合使用所学过的汇编语言程序设计知识,掌握结构化程序设计的基本思路和方法,利用所学的基本知识和技能,发挥自学能力和查找资料的能力,解决稍微复杂的结构化程序设计问题,加深对所学知识的理解与掌握,增强学生利用自己所学知识解决实际问题的能力,为以后的程序开发打下基础。
课程设计的目的和要求:
(1)使学生巩固和加强《汇编语言》课程的理论知识。
(2)使学生掌握汇编语言的基本概念、语法、语义和数据类型的使用特点。
(3)使学生掌握汇编语言程序设计的方法及编程技巧,能正确使用汇编语言编写程序。
(3)进一步理解与运用结构化程序设计的思想和方法;学会利用流程图或N-S图表示算法。
(4)使学生掌握调试程序的基本方法及上机操作方法。
(5)掌握书写程设计开发文档的能力,使学生学会撰写课程设计总结报告。
课程设计的思想和方法还可以作为学生做毕业论文时的参考资料。
(6)通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。
为学生做毕业设计打好基础。
(7)初步掌握开发一个小型实用系统的基本方法:
结合实际应用的要求,使课程设计既覆盖知识点,又接近工程实际需要。
通过激发学习兴趣,调动学生主动学习的积极性,并引导他们根据实际编程要求,训练自己实际分析问题的能力及编程能力,并养成良好的编程习惯。
(8)培养学生的创新能力和创新思维。
学生可以根据指导书和相关文献上的参考算法,自己设计出相应的应用程序。
(9)培养学生良好的程序设计风格。
在实际编程中,为了提高编程质量,对空行、空格和注释均有要求。
学生在课程设计书写代码时,应该严格按要求处理,以便建立良好的程序设计风格。
2.课程设计的题目——矩阵相乘
(1)要求:
掌握多重循环程序的设计方法,并熟悉有关矩阵的编程原理。
(2)内容:
将一个4X4的矩阵与一个4X1的矩阵相乘,将结果存入相应的单元,分别用十进制数、二进制、十六进制形式显示结果。
3.课程设计环境
(1)硬件:
PC机。
(2)软件:
操作系统为64位Windows7,设计语言为MASMFORWINDOWS汇编语言集成实验环境。
4.课程设计要求
(1)课程设计可采取每人一题,可任选一题进行设计,至少包含五个功能模块。
或者每组完成一个课题,每组成员分工合作完成一个课程设计,每个人的任务不同;
(2)可以选择老师提供的参考选题,也可以自选,如果自选,需要将自选题目的详细内容以及实现要求提供给老师,老师批准后方可采用;
(3)要求利用结构化程序设计方法以及汇编语言的编程思想来完成系统的设计;
(4)要求有欢迎界面、菜单、文件操作,数据使用数组、结构体等均可,键盘操作或鼠标操作均可;
(5)模块化程序设计:
要求在设计的过程中,按功能定义过程或宏,多个模块化设计可以用文件的形式来实现;
(6)学生所选课题必须上机通过,并获得满意的结果;
(7)程序书写风格:
锯齿型书写格式。
二.软件需求分析和设计
(1)需求分析本程序主要实现的功能是一个4*4矩阵与4*1矩阵相乘最后得到一个4*1矩阵,并且要求用三种方式输出这个矩阵,分别是二进制和十六进制和十进制。
并且这个程序要求菜单的选择。
(2)下面就是这个程序的流程图
、
输出流程图
主流程图
Y
N
十进制矩阵输出
十六进制矩阵输出
二进制矩阵输出
三.程序实现说明(介绍程序实现过程,包括关键代码分析(注意:
应该限制代码的数量))
1.矩阵相乘关键代码
MUL_AB:
;矩阵相乘
MOVDI,0
MOVHH,0
;--------嵌套循环-------------
MUL_0:
MOVLL,0
;---------------------
MUL_1:
MOVBX,HH;HH为空,BX清零
ADDBX,HH
MOVSI,LL;LL为空,SI清零
ADDSI,LL
MOVCX,LA;将4传给CX
;---------------------
MUL_2:
MOVAX,MA[BX];矩阵一的第一个数放进AX
MOVDX,MB[SI];矩阵二的第一个数放进DX
MULDX;两数相乘
ADDMC[DI],AX;结果矩阵第一数先放上AX
ADDBX,2;地址往下移
ADDSI,2*LB;地址下移矩阵二列数*2
LOOPMUL_2
;---------------------
ADDDI,2;地址往下移
INCLL;列数加1
CMPLL,LB;比较结果矩阵列数与矩阵二的列数
JNZMUL_1
;---------------------
ADDHH,LA;结果矩阵行数
CMPHH,HA*LA;比较结果矩阵行数数与矩阵一的行数与列数的乘积
JBMUL_0
RET
2.十进制转换关键代码
PRINT_AX:
;将存在AX中的数按照十进制输出
PUSHBX
PUSHCX
PUSHDX
MOVBX,10
MOVCX,0
P_LOP1:
MOVDX,0
DIVBX;直接除以10,余数在DX一次输出一个
INCCX
PUSHDX
CMPAX,0;商存在AX中,接着用来取余数放到DX里面
JNZP_LOP1
MOVAH,2
P_LOP2:
POPDX
ADDDL,'0'
INT21H
LOOPP_LOP2;CX自加多少次,就自减多少次,输出整个数
POPDX
POPCX
POPBX
RET
3.十六进制转换关键代码
HSPPROCFAR;十六进制转换子程序
PUSHBX
PUSHCX
PUSHDX
MOVBX,AX
MOVCH,04D;CH初始定义为4
ROTATE:
MOVCL,04D;CL初始定义为4
ROLBX,CL;对操作数进行循环左移4次,每执行一次,把最高位移到最低位,同时还把最高位移到CF
MOVAL,BL
ANDAL,0FH;取AL的低四位
ADDAL,30H;加上30H输出
CMPAL,'9';AL与9比较
JBEPRINT2;小于等于就会跳到PRINT2
ADDAL,07H;大于AL加上07H,变成字母ABCDEF
PRINT2:
MOVDL,AL;AL给DL输出出来
MOVAH,2
INT21H
DECCH;ch自减,不为零继续循环上面代码
JNEROTATE
MOVAH,2
MOVDL,'H'
INT21H
POPDX
POPCX
POPBX
RET
HSPENDP
4.二进制转换关键代码
DSPPROCFAR;二进制转换子程序
PUSHBX
PUSHCX
PUSHDX
MOVBX,AX;把数值放到BX保护起来,BX中本身放的就是二进制
MOVCX,16;为循环做准备
T:
SHLBX,1;把BX的值向左移一位,其高位放在CF标志位里
JCPRINT4;如果高位是1就输出1
JNCPRINT5;如果高位是0就输出0
PRINT4:
MOVDL,31H;把要在屏幕上输出的字符预先放到DL寄存器里,31H表示字符1
MOVAH,2
INT21H
JMPL
PRINT5:
MOVDL,30H;把要在屏幕上输出的字符预先放到DL寄存器里,31H表示字符0
MOVAH,2
INT21H
L:
LOOPT
MOVAH,2
MOVDL,'B'
INT21H
POPDX
POPCX
POPBX
RET
DSPENDP
5.运行结果截图
菜单截图
矩阵一矩阵二和相乘后矩阵截图(十进制)
矩阵三十六机制和二进制截图
四.程序总结(软件完成情况,有哪些收获,存在哪些不足
对课程设计有哪些建议)
这次课设我完成的主要是矩阵的相乘和输出矩阵的进制转换,以及光标定位,菜单输出等等功能!
这次课设的时间有两周,其实主要完成在最后一周,通过这次试验最大的收获就是看程序一定要耐心,虽然程序是我拼凑而成,但是基本上已经读懂整个程序,途中遇见几个问题,非常感谢老师和同学们的帮助,最终完成了这个程序。
存在的不足之处就是这两个矩阵是固定格式的,不能任意矩阵相乘,希望以后可以改进,这个课设学习了很多,新的知识主要是BOIS功能的调用,主要集中在字体颜色变化和光标的定位,还学到了矩阵相乘中的嵌套循环,这个对于循环反复操作不同的数非常的重要!
另外还了解了进制转换的方法,也是利用了循环移位的操作,本来我觉得汇编是个令人头疼的语言,但是你只要紧紧抓住它其中数的变化就行,能够准确定位数的位置及作用,而且还要了解数的及时清零与更新!
往往其中很容易混淆的就是数的位置和作用,之前很容易的辨认错误!
这次的实验还是学到了很多东西,主要感谢老师和同学的指导,总体上来说,完成了基本课设要求!
希望在以后的学习中,也应该有那种细心钻研的精神!
源代码:
DATASEGMENT
;================菜单的定义===============
str1db'***********************Menu:
*******************',13,10
mess1db'********1:
printthefirstarray:
***************',13,10
mess2db'********2:
printthesecondarray:
**************',13,10
mess3db'********3:
printtheHexadecimalsystemarray:
*',13,10
mess4db'********4:
printtheBinarysystemarray:
*******',13,10
mess5db'********5:
printtheDecimalsystemarray:
******',13,10
mess6db'*******************END*************************',13,10
length1equ$-str1
STR2db'pleasemakeyourchoose:
',13,10
;-----------------------------
array1DB'thefirstarrayis(4*4):
','$'
array2DB'thesecondarrayis(4*1):
','$'
HDB'printarray1*array2(Hexadecimalsystem):
','$'
BDB'printarray1*array2(Binarysystem):
','$'
DDB'printarray1*array2(Decimalsystem):
','$'
;----------------------------
MADW11,12,13,14;定义4*4矩阵MA
DW21,22,23,24
DW31,32,33,34
DW41,42,43,44
HAEQU4;行数
LAEQU4;列数
;-----------------------------
MBDW12;定义4*1矩阵MB
DW11
DW11
DW11
HBEQU4
LBEQU1
;-----------------------------
MCDWHA*LBDUP();定义结果矩阵
HCEQUHA
LCEQULB
HHDW
LLDW
;==============宏的定义==============
;--------------光标的初始定义-------
cursormacrorow,rank
movah,2
movdh,row
movdl,rank
movbh,0
int10h
endm
;回车换行
hchhmacro
movdl,10
movah,2
int21h
movdl,13
movah,2
int21h
endm
;字符串输出
PRINTmacrox
movah,9
leadx,x
int21h
endm
DATAENDS
;***********************************
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
;==========光标和菜单字体颜色设置==========
moval,3
movah,00h
int10h
movbp,segstr1
moves,bp
movbp,offsetstr1
movcx,length1
movdx,0
movbl,05h;菜单红字定义
moval,0
cursor2,15;菜单光标初始定义
movah,13h
int10h
;==========================================
;---------菜单跳转选项-----------
hchh
cursor12,0
out1:
movah,1
int21h
cmpal,'1'
jzL1
cmpal,'2'
jzL2
cmpal,'3'
jzL3
cmpal,'4'
jzL4
cmpal,'5'
jzL5
jmpEXIT
;----------------主程序-------------------
L1:
PRINTarray1
HCHH
MOVBX,OFFSETMA;输出第一个矩阵
MOVCX,LA
MOVDX,HA
CALLPRINT_M
HCHH
JMPOUT1
L2:
PRINTarray2
HCHH
MOVBX,OFFSETMB;输出第二个矩阵
MOVCX,LB
MOVDX,HB
CALLPRINT_M1
CALLhuanhang
HCHH
JMPOUT1
L3:
PRINTD
HCHH
CALLMUL_AB;矩阵相乘
MOVBX,OFFSETMC;结果十进制输出
MOVCX,LC
MOVDX,HC
CALLPRINT_M2
HCHH
JMPOUT1
L4:
PRINTH
HCHH
MOVBX,OFFSETMC;结果十六进制输出
MOVCX,LC
MOVDX,HC
CALLPRINT_Z2
HCHH
JMPOUT1
L5:
PRINTB
HCHH
MOVBX,OFFSETMC;结果二进制输出
MOVCX,LC
MOVDX,HC
CALLPRINT_Z3
EXIT:
MOVAH,4CH
INT21H
;******************************
PRINT_M:
;第一个矩阵输出
PUSHCX
pushax;提示文字,并保护寄存器
pushdx
popdx
popax
PR2:
MOVAX,[BX];将BX数给AX
CALLPRINT_AX;直接输出一个数(十进制数)
CALLTAB_09;输出空格
ADDBX,2;转到下一个数
LOOPPR2
POPCX;根据列判断一行输入多少数据
CALLhuanhang;输出一行的数后立即换行
DECDX;DX自减
JNZPRINT_M;DX不为零直接跳到上面继续输出余数
RET
;******************************
PRINT_M1:
;第二个矩阵输出
PUSHCX
pushax
pushdx
popdx
popax
PR20:
MOVAX,[BX]
CALLPRINT_AX
CALLTAB_09
ADDBX,2
LOOPPR20
POPCX
CALLhuanhang;输出一列后立即换行
DECDX
JNZPRINT_M1
RET
;******************************
PRINT_M2:
;相乘矩阵后的输出
PUSHCX
pushax
pushdx
popdx
popax
PR21:
MOVAX,[BX]
CALLPRINT_AX
CALLTAB_09
ADDBX,2
LOOPPR21
POPCX
CALLhuanhang;输出一列后立即换行
DECDX
JNZPRINT_M2
RET
;******************************
PRINT_AX:
;将存在AX中的数按照十进制输出
PUSHBX
PUSHCX
PUSHDX
MOVBX,10
MOVCX,0
P_LOP1:
MOVDX,0
DIVBX;直接除以10,余数在DX一次输出一个
INCCX
PUSHDX
CMPAX,0;商存在AX中,接着用来取余数放到DX里面
JNZP_LOP1
MOVAH,2
P_LOP2:
POPDX
ADDDL,'0'
INT21H
LOOPP_LOP2;CX自加多少次,就自减多少次,输出整个数
POPDX
POPCX
POPBX
RET
;******************************
huanhang:
;段内换行,去掉这个后会陷于死循环!
PUSHAX
PUSHDX
MOVAH,2
MOVDL,13
INT21H
MOVDL,10
INT21H
POPDX
POPAX
RET
;******************************
TAB_09:
;TAB功能调用,让矩阵的输出更加规范!
PUSHAX
PUSHDX
MOVAH,2
MOVDL,9
INT21H
POPDX
POPAX
RET
;&&&&&&&&&&&&&&&矩阵相乘&&&&&&&&&&&&&&
MUL_AB:
;矩阵相乘
MOVDI,0
MOVHH,0
;--------嵌套循环-------------
MUL_0:
MOVLL,0
;---------------------
MUL_1:
MOVBX,HH;HH为空,BX清零
ADDBX,HH
MOVSI,LL;LL为空,SI清零
ADDSI,LL
MOVCX,LA;将4传给CX
;---------------------
MUL_2:
MOVAX,MA[BX];矩阵一的第一个数放进AX
MOVDX,MB[SI];矩阵二的第一个数放进DX
MULDX;两数相乘
ADDMC[DI],AX;结果矩阵第一数先放上AX
ADDBX,2;地址往下移
ADDSI,2*LB;地址下移矩阵二列数*2
LOOPMUL_2
;---------------------
ADDDI,2;地址往下移
INCLL;列数加1
CMPLL,LB;比较结果矩阵列数与矩阵二的列数
JNZMUL_1
;---------------------
ADDHH,LA;结果矩阵行数
CMPHH,HA*LA;比较结果矩阵行数数与矩阵一的行数与列数的乘积
JBMUL_0
RET
;%%%%%%%%%%%%%%十六进制输出%%%%%%%%%%%%%%
PRINT_Z2:
;十六进制矩阵输出
PUSHCX
pushax
pushdx
popdx
popax
print1:
MOVAX,[BX]
CALLHSP
CALLTAB_09
ADDBX,2
LOOPprint1;第一行输出
POPCX
CALLhuanhang;输出一列后立即换行
DECDX
JNZPRINT_Z2
RET
HSPPROCFAR;十六进制转换子程序
PUSHBX
PUSHCX
PUSHDX
MOVBX,AX
MOVCH,04D;CH初始定义为4
ROTATE:
MOVCL,04D;CL初始定义为4
ROLBX,CL;对操作数进行循环左移4次
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 矩阵 相乘 课程设计 源代码