1、华 北 科 技 学 院课程设计阐明书班级: 姓名: 学号: 课程名称: 汇编语言课程设计 课设时间: -12-05 至 -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) 使学生掌握调试程序基本办法及上机操作办法。(5)掌握书写程设计开
3、发文档能力,使学生学会撰写课程设计总结报告。课程设计思想和办法还可以作为学生做毕业论文时参照资料。(6)通过查阅手册和文献资料,培养学生独立分析问题和解决问题能力。为学生做毕业设计打好基本。(7)初步掌握开发一种小型实用系统基本办法:结合实际应用规定,使课程设计既覆盖知识点,又接近工程实际需要。通过激发学习兴趣,调动学生积极学习积极性,并引导她们依照实际编程规定,训练自己实际分析 问题能力及编程能力,并养成良好编程习惯。(8)培养学生创新能力和创新思维。学生可以依照指引书和有关文献上参照算法,自己设计出相应应用程序。(9)培养学生良好程序设计风格。在实际编程中,为了提高编程质量,对空行、空格和
4、注释均有规定。学生在课程设计书写代码时,应当严格按规定解决,以便建立良 好程序设计风格。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)程序书写风格:锯齿型书写格式。二 软件需求分析和设计(1)需求分析本程序重要实现功能是一种4*4矩阵与4*1矩阵相乘最后得到一种4*1矩阵,并且规定用三种方式输出
6、这个矩阵,分别是二进制和十六进制和十进制。并且这个程序规定菜单选取。(2)下面就是这个程序流程图、 开始 菜单选取输出第一种矩阵(十进制) 输出第二个矩阵(十进制) 矩阵相乘运算(矩阵相乘规则)输出成果矩阵(十进制) 输出流程图开始将BX值和地址给AX输出成果矩阵(十六进制)以十进制输出AX第一种数输出成果矩阵(二进制)NN地址转移下个数,中间TAB功能 结束 列数CX=0? 主流程图 Y行数DX=0?Y 结束开始开始获得AX中一种数获得AX中一种数 循环左移四位除以10,商放在AX,余数放在DX取出AL低四位加上30H输出AX=0?NYAL9?余数出栈输出NYNCX=0? N加上07H变成A
7、-F Y输出一种数 结束开始CH=0? 十进制矩阵输出获得AX中一种数Y结束逻辑左移一位与否进位?N 十六进制矩阵输出NY输出0输出1CX=0?Y开始 二进制矩阵输出 开始列循环数初始赋值行循环数初始赋值重新定义偏移量和CXYN边相乘边存储CX=0?YY第二矩阵与否有第二列?N行循环数加一与否有下一行?N开始 三 程序实现阐明(简介程序实现过程,涉及核心代码分析(注意:应当限制代码数量)1.矩阵相乘核心代码MUL_AB:;矩阵相乘 MOV DI,0 MOV HH,0;-嵌套循环- MUL_0: MOV LL,0;- MUL_1: MOV BX,HH;HH为空,BX清零 ADD BX,HH MO
8、V SI,LL;LL为空,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 * LA;比较成果矩阵行数数与矩
9、阵一行数与列数乘积 JB MUL_0 RET2.十进制转换核心代码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自加多少次,就自减多少次,输出整个数 POP DX POP CX POP BX RE
10、T3.十六进制转换核心代码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 ADD AL,07H ;不不大于AL加上07H ,变成字母ABCDEF PRINT
11、2: 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 ENDP4.二进制转换核心代码DSP PROC FAR;二进制转换子程序 PUSH BX PUSH CX PUSH DX MOV BX,AX;把数值放到BX保护起来,BX中自身放就是二进制 MOV CX,16;为循环做准备 T: SHL BX,1 ;把BX值向左移一位,其高位放在CF标志位里 JC PRINT4 ;如果高位是1就输出1 J
12、NC 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 ENDP5. 运营成果截图菜单截图矩阵一矩阵二和相乘后矩阵截图(十进制)矩阵三十六机制和二进制截图四 程序总结(软件完毕状况,有哪些收获,存在哪些局限
13、性对课程设计有哪些建议)这次课设我完毕重要是矩阵相乘和输出矩阵进制转换,以及光标定位,菜单输出等等功能!这次课设时间有两周,其实重要完毕在最后一周,通过这次实验最大收获就是看程序一定要耐心,虽然程序是我拼凑而成,但是基本上已经读懂整个程序,途中碰见几种问题,非常感谢教师和同窗们协助,最后完毕了这个程序。存在局限性之处就是这两个矩阵是固定格式,不能任意矩阵相乘,但愿后来可以改进,这个课设学习了诸多,新知识重要是BOIS功能调用,重要集中在字体颜色变化和光标定位,还学到了矩阵相乘中嵌套循环,这个对于循环重复操作不同数非常重要!此外还理解了进制转换办法,也是运用了循环移位操作,本来我觉得汇编是个令人
14、头疼语言,但是你只要紧紧抓住它其中数变化就行,可以准拟定位数位置及作用,并且还要理解数及时清零与更新!往往其中很容易混淆就是数位置和作用,之前很容易辨认错误!这次实验还是学到了诸多东西,重要感谢教师和同窗指引,总体上来说,完毕了基本课设规定!但愿在后来学习中,也应当有那种细心钻研精神!源代码:DATA SEGMENT;=菜单定义=str1 db *Menu:*,13,10 mess1 db *1:print the first array:*,13,10 mess2 db *2:print the second array:*,13,10 mess3 db *3:print the Hexad
15、ecimal 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 $-str1STR2 db please make your choose:,13,10;-array1 DB the first array is (4*4):,$array2 DB the second array is (4*1):,$H DB print array1
16、*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,44HA EQU 4 ;行数LA EQU 4 ;列数;-MB DW 12 ;定义4*1矩阵MB DW 11 DW 11 DW 11HB EQU 4 LB EQU 1;-MC DW HA * LB DUP(?) ;定义成果矩阵
17、HC EQU HALC EQU LBHH DW ?LL DW ?;=宏定义=;-光标初始定义-cursor macro row,rankmov ah,2mov dh,rowmov dl,rankmov bh,0int 10hendm;回车换行hchh macro mov dl,10mov ah,2int 21hmov dl ,13mov ah,2int 21hendm;字符串输出PRINT macro xmov ah,9lea dx,xint 21hendmDATA ENDS;* CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MO
18、V DS,AX;=光标和菜单字体颜色设立= mov al,3mov ah,00hint 10hmov bp,seg str1mov es,bpmov bp,offset str1mov cx,length1mov dx,0mov bl,05h;菜单红字定义mov al,0cursor 2,15;菜单光标初始定义mov ah,13hint 10h;= ;-菜单跳转选项-hchhcursor 12,0out1:mov ah,1int 21hcmp al,1jz L1cmp al,2jz L2cmp al,3jz L3cmp al,4jz L4cmp al,5jz L5jmp EXIT;-主程序-
19、L1: PRINT array1 HCHH MOV BX,OFFSET MA ;输出第一种矩阵 MOV CX,LA MOV DX,HA CALL PRINT_M HCHH JMP OUT1 L2: PRINT array2 HCHH MOV BX,OFFSET MB ;输出第二个矩阵 MOV CX,LB MOV DX,HB CALL PRINT_M1 CALL huanhang HCHH JMP OUT1 L3: PRINT D HCHH CALL MUL_AB ;矩阵相乘 MOV BX,OFFSET MC ;成果十进制输出 MOV CX,LC MOV DX,HC CALL PRINT_M2
20、HCHH JMP OUT1 L4: PRINT H HCHH MOV BX,OFFSET MC ;成果十六进制输出 MOV CX,LC MOV DX,HC CALL PRINT_Z2 HCHH JMP OUT1 L5: PRINT B HCHH MOV BX,OFFSET MC ;成果二进制输出 MOV CX,LC MOV DX,HC CALL PRINT_Z3 EXIT: MOV AH,4CH INT 21H;* PRINT_M: ;第一种矩阵输出 PUSH CX push ax ;提示文字,并保护寄存器 push dx pop dx pop ax PR2: MOV AX,BX;将BX数给A
21、X CALL PRINT_AX ;直接输出一种数(十进制数) CALL TAB_09 ;输出空格 ADD BX,2 ;转到下一种数 LOOP PR2 POP CX ;依照列判断一行输入多少数据 CALL huanhang;输出一行数后及时换行 DEC DX;DX自减 JNZ PRINT_M;DX不为零直接跳到上面继续输出余数 RET;* PRINT_M1:;第二个矩阵输出 PUSH CX push ax push dx pop dx pop ax PR20: MOV AX,BX CALL PRINT_AX CALL TAB_09 ADD BX,2 LOOP PR20 POP CX CALL h
22、uanhang;输出一列后及时换行 DEC DX JNZ PRINT_M1 RET ;* PRINT_M2:;相乘矩阵后输出 PUSH CX push ax push dx pop dx pop ax PR21: MOV AX,BX CALL PRINT_AX CALL TAB_09 ADD BX,2 LOOP PR21 POP CX CALL huanhang;输出一列后及时换行 DEC DX JNZ PRINT_M2 RET;* PRINT_AX:;将存在AX中数按照十进制输出 PUSH BX PUSH CX PUSH DX MOV BX,10 MOV CX,0 P_LOP1: MOV D
23、X,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自加多少次,就自减多少次,输出整个数 POP DX POP CX POP BX RET;* huanhang:;段内换行,去掉这个后会陷于死循环! PUSH AX PUSH DX MOV AH,2 MOV DL,13 INT 21H MOV DL,10 INT 21H POP DX POP AX RET;* T
24、AB_09:;TAB功能调用,让矩阵输出更加规范! PUSH AX PUSH DX MOV AH,2 MOV DL,9 INT 21H POP DX POP AX RET;&矩阵相乘& 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为空,SI清零 ADD SI,LL MOV CX,LA;将4传给CX;- MUL_2: MOV AX,MABX;矩阵一第一种数放进AX MOV DX,MBSI;矩阵二第一种数放进DX MUL DX;两数相
25、乘 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 * LA;比较成果矩阵行数数与矩阵一行数与列数乘积 JB MUL_0 RET;%十六进制输出% PRINT_Z2: ;十六进制矩阵输出 PUSH CX push ax push dx pop dx pop ax print1: MOV AX,BX CALL
26、 HSP CALL TAB_09 ADD BX,2 LOOP print1;第一行输出 POP CX CALL huanhang;输出一列后及时换行 DEC DX JNZ PRINT_Z2 RETHSP 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输出
27、 CMP AL,9;AL与9比较 JBE PRINT2;不大于等于就会跳到PRINT2 ADD 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;%十六进制输出%;*二进制输出* PRINT_Z3: ;二进制矩阵输出 PUSH CX push ax push dx pop dx pop ax print3
28、: MOV AX,BX;将BX值传给AX CALL DSP CALL TAB_09 ADD BX,2;执行一种数地址加2,到下一种数 LOOP print3;第一行输出 POP CX;CX出栈 CALL huanhang;输出一列后及时换行 DEC DX;DX出栈 JNZ PRINT_Z3 RET DSP PROC FAR;二进制转换子程序 PUSH BX PUSH CX PUSH DX MOV BX,AX;把数值放到BX保护起来,BX中自身放就是二进制 MOV CX,16;为循环做准备 T: SHL BX,1 ;把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;*二进制输出*CODE ENDS END START