《汇编语言矩阵相乘课程设计.docx》由会员分享,可在线阅读,更多相关《汇编语言矩阵相乘课程设计.docx(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、汇编语言矩阵相乘课程设计 华北科技学院 课程设计说明书 班级: 姓名: 学号: 课程名称: 汇编语言课程设计 课设时间: 2022-12-05 至 2022-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.课程设计的目的: 使学生综
2、合使用所学过的汇编语言程序设计知识,掌握结构化程序设计的基本思路和方法,利用所学的基本知识和技能,发挥自学能力和查找资料的能力,解决稍微复杂的结构化程序设计问题,加深对所学知识的理解与掌握,增强学生利用自己所学知识解决实际问题的能力,为以后的程序开发打下基础。 课程设计的目的和要求: (1)使学生巩固和加强汇编语言课程的理论知识。 (2)使学生掌握汇编语言的基本概念、语法、语义和数据类型的使用特点。 (3)使学生掌握汇编语言程序设计的方法及编程技巧,能正确使用汇编语言编写程序。 (3)进一步理解与运用结构化程序设计的思想和方法;学会利用流程图或N-S图表示算法。 (4)使学生掌握调试程序的基本
3、方法及上机操作方法。 (5)掌握书写程设计开发文档的能力,使学生学会撰写课程设计总结报告。课程设计的思想和方法还可以作为学生做毕业论文时的参考资料。 (6)通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。为学生做毕业设计打好基础。 (7)初步掌握开发一个小型实用系统的基本方法:结合实际应用的要求,使课程设计既覆盖知识点,又接近工程实际需要。通过激发学习兴趣,调动学生主动学习的积极 性,并引导他们根据实际编程要求,训练自己实际分析问题的能力及编程能力, 并养成良好的编程习惯。 (8)培养学生的创新能力和创新思维。学生可以根据指导书和相关文献上的参考算法,自己设计出相应的应用程序。
4、(9)培养学生良好的程序设计风格。在实际编程中,为了提高编程质量,对空行、空格和注释均有要求。学生在课程设计书写代码时,应该严格按要求处理,以便建立良 好的程序设计风格。 2.课程设计的题目矩阵相乘 (1)要求:掌握多重循环程序的设计方法,并熟悉有关矩阵的编程原理。 (2)内容:将一个4 X 4 的矩阵与一个4 X 1 的矩阵相乘,将结果存入相应的单元,分别用十进制数、二进制、十六进制形式显示结果。 3.课程设计环境 (1)硬件:PC机。 (2)软件:操作系统为64位Windows7,设计语言为MASM FOR WINDOWS 汇编语言集成实验环境。 4.课程设计要求 (1)课程设计可采取每人
5、一题,可任选一题进行设计,至少包含五个功能模块。或者每组完成一个课题,每组成员分工合作完成一个课程设计,每个人的任务不同; (2)可以选择老师提供的参考选题,也可以自选,如果自选,需要将自选题目的详细内容以及实现要求提供给老师,老师批准后方可采用; (3)要求利用结构化程序设计方法以及汇编语言的编程思想来完成系统的设计; (4)要求有欢迎界面、菜单、文件操作,数据使用数组、结构体等均可,键盘操作或鼠标操作均可; (5)模块化程序设计:要求在设计的过程中,按功能定义过程或宏,多个模块化设计可以用文件的形式来实现; (6)学生所选课题必须上机通过,并获得满意的结果; (7)程序书写风格:锯齿型书写
6、格式。 二软件需求分析和设计 (1)需求分析本程序主要实现的功能是一个4*4矩阵与4*1矩阵相乘最后得到一个4*1矩阵,并且要求用三种方式输出这个矩阵,分别是二进制和十六进制和十进制。并且这个程序要求菜单的选择。 (2)下面就是这个程序的流程图 、 三 程序实现说明(介绍程序实现过程,包括关键代码分析(注意: 应该限制代码的数量) Y Y 1.矩阵相乘关键代码 MUL_AB: ;矩阵相乘 MOV DI, 0 MOV HH, 0 ;-嵌套循环- MUL_0: MOV LL, 0 ;- MUL_1: MOV BX, HH ;HH为空,BX清零 ADD BX, HH MOV SI, LL ;LL为空
7、,SI清零 ADD SI, LL MOV CX, LA ;将4传给CX ;- MUL_2: MOV AX, MABX ;矩阵一的第一个数放进AX MOV DX, MBSI ;矩阵二的第一个数放进DX MUL DX ;两数相乘 ADD MCDI, AX ;结果矩阵第一数先放上AX ADD BX, 2 ;地址往下移 ADD SI, 2 * LB ;地址下移矩阵二列数*2 LOOP MUL_2 ;- ADD DI, 2 ;地址往下移 INC LL ;列数加1 CMP LL, LB ;比较结果矩阵列数与矩阵二的列数 JNZ MUL_1 ;- ADD HH, LA ;结果矩阵行数 CMP HH, HA
8、* LA ;比较结果矩阵行数数与矩阵一的行数与列数的乘积 JB MUL_0 RET 2.十进制转换关键代码 PRINT_AX: ;将存在AX中的数按照十进制输出 PUSH BX PUSH CX PUSH DX MOV BX, 10 MOV CX, 0 P_LOP1: MOV DX, 0 DIV BX ;直接除以10,余数在DX一次输出一个 INC CX PUSH DX CMP AX, 0 ;商存在AX中,接着用来取余数放到DX里面 JNZ P_LOP1 MOV AH, 2 P_LOP2: POP DX ADD DL, 0 INT 21H LOOP P_LOP2 ;CX自加多少次,就自减多少次,
9、输出整个数 POP DX POP CX POP BX RET 3.十六进制转换关键代码 HSP PROC FAR ;十六进制转换子程序 PUSH BX PUSH CX PUSH DX MOV BX,AX MOV CH,04D ;CH初始定义为4 ROTATE: MOV CL,04D ;CL初始定义为4 ROL BX,CL ;对操作数进行循环左移4次,每执行一次,把最高位移到最低位,同时还把最高位移到CF MOV AL,BL AND AL,0FH ;取AL的低四位 ADD AL,30H ;加上30H输出 CMP AL,9 ;AL与9比较 JBE PRINT2 ;小于等于就会跳到PRINT2 AD
10、D AL,07H ;大于AL加上07H ,变成字母ABCDEF PRINT2: MOV DL,AL ;AL给DL输出出来 MOV AH,2 INT 21H DEC CH ;ch自减,不为零继续循环上面代码 JNE ROTATE MOV AH,2 MOV DL,H INT 21H POP DX POP CX POP BX RET HSP ENDP 4.二进制转换关键代码 DSP PROC FAR ;二进制转换子程序 PUSH BX PUSH CX PUSH DX MOV BX,AX ;把数值放到BX保护起来,BX中本身放的就是二进制 MOV CX,16 ;为循环做准备 T: SHL BX,1 ;
11、把BX的值向左移一位,其高位放在CF标志位里 JC PRINT4 ;如果高位是1就输出1 JNC PRINT5 ;如果高位是0就输出0 PRINT4: MOV DL,31H ;把要在屏幕上输出的字符预先放到DL寄存器里,31H表示字符1 MOV AH,2 INT 21H JMP L PRINT5: MOV DL,30H ;把要在屏幕上输出的字符预先放到DL寄存器里,31H表示字符0 MOV AH,2 INT 21H L: LOOP T MOV AH,2 MOV DL,B INT 21H POP DX POP CX POP BX RET DSP ENDP 5. 运行结果截图 菜单截图 矩阵一矩阵
12、二和相乘后矩阵截图(十进制) 矩阵三十六机制和二进制截图 四程序总结(软件完成情况,有哪些收获,存在哪些不足对课程设计有哪些建议) 这次课设我完成的主要是矩阵的相乘和输出矩阵的进制转换,以及光标定位,菜单输出等等功能!这次课设的时间有两周,其实主要完成在最后一周,通过这次试验最大的收获就是看程序一定要耐心,虽然程序是我拼凑而成,但是基本上已经读懂整个程序,途中遇见几个问题,非常感谢老师和同学们的帮助,最终完成了这个程序。存在的不足之处就是这两个矩阵是固定格式的,不能任意矩阵相乘,希望以后可以改进,这个课设学习了很多,新的知识主要是BOIS功能的调用,主要集中在字体颜色变化和光标的定位,还学到了
13、矩阵相乘中的嵌套循环,这个对于循环反复操作不同的数非常的重要!另外还了解了进制转换的方法,也是利用了循环移位的操作,本来我觉得汇编是个令人头疼的语言,但是你只要紧紧抓住它其中数的变化就行,能够准确定位数的位置及作用,而且还要了解数的及时清零与更新!往往其中很容易混淆的就是数的位置和作用,之前很容易的辨认错误!这次的实验还是学到了很多东西,主要感谢老师和同学的指导,总体上来说,完成了基本课设要求!希望在以后的学习中,也应该有那种细心钻研的精神! 源代码: DATA SEGMENT ;=菜单的定义= str1 db *Menu:*,13,10 mess1 db *1:print the first
14、 array:*,13,10 mess2 db *2:print the second array:*,13,10 mess3 db *3:print the Hexadecimal system array:*,13,10 mess4 db *4:print the Binary system array:*,13,10 mess5 db *5:print the Decimal system array:*,13,10 mess6 db *END*,13,10 length1 equ $-str1 STR2 db please make your choose:,13,10 ;- arra
15、y1 DB the first array is (4*4):,$ array2 DB the second array is (4*1):,$ H DB print array1*array2(Hexadecimal system):,$ B DB print array1*array2(Binary system):,$ D DB print array1*array2(Decimal system):,$ ;- MA DW 11, 12, 13, 14 ;定义4*4矩阵MA DW 21, 22, 23, 24 DW 31, 32, 33, 34 DW 41, 42, 43, 44 HA EQU 4 ;行数 LA EQU 4 ;列数 ;- MB DW 12 ;定义4*1矩阵MB DW 11 DW 11 DW 11 HB EQU 4 LB EQU 1 ;- MC DW HA * LB DUP(?) ;定义结果矩阵 HC EQU HA LC EQU LB HH DW ? LL DW ? ;=宏的定义=
限制150内