1、盐城工学院汇编语言程序设计课程设计说明书I汇 编 语 言 课 程 设 计 报 告( 2014 - 2015 年度第 1 学期)课题名称: 打字计时练习程序专业 xxx学生姓名 xxxx班级 xxx学号 xxxx指导教师 xxx完成日期 xxxxx盐城工学院汇编语言程序设计课程设计说明书II目录1.设计目的与设计要求2.程序流程图 .62.1主程序流程图 .62.2时间计算流程图 .72.3正确率计算流程图 .83.设计关键问题 103.1输入输出 103.1.1 输出显示信息 103.1.2 输入十个字符 123.2 输入字符串所用时间计算 .123.3 正确率判断 .144.调试运行结果分析
2、 15参考文献 21附录二 打字计时练习程序 24盐城工学院汇编语言程序设计课程设计说明书III一.设计目的本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题,解决问题的综合应用能力。设计要求在缓冲区预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间。设计思路1. 系统总体分析在缓存区预放了一些字母,运行时可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间。当一个句子分析完后(回车键作为结束符),屏幕上以 min:
3、sec:msec 的格式显示出键入字符的时间。在每次打字之前,屏幕上先显示一个例句,然后打字员按照例句,将句中字符通过键盘输入。这个过程共进行五次,当键入一个 enter 键时,推出打字计时练习程序。在键盘上联系的打字例句及其他地址表,计时单位等预存在 DATA 数据段中。自编的中断程序 Kbint 检测按键时产生的中断,并将按键扫描码转换为 ASCII 码存入缓存区 BUFFER(内存中一个区域),这个工作和 EOM09 类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时作了简化,即只解释了可显示字符(如英文小写字母,数字及一些字符),其他特殊键(如组合键,双态键,功能键),都未
4、做解释,只做字符码 0 来处理。在主程序部分保存原有 09 类型的中断向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后在开断。当键盘中断处理后,主程序安排指令读取缓存区中的字符并显示在屏幕上。在主程序的末尾,利用 DOS 功能恢复原 09 类型的中断向量,然后返回 DOS。在显示键入的字符时,还应判断字符是否为回车符。说明一个句子输入完毕,此时调用显示时间的子程序显示打字时间,然后顺序显示一个例句。如果所存放的例句都已显示完毕,则再次从第一个例句开始显示,直至键入某个功能(如 ESC 键等)退出程序,结束打字练习。打字时间统计利用自编的计时器中断处理程序 Clint 来完成。每输入一个例
5、句,计时一次。在此中断例行程序中,定时器中断的次数记录盐城工学院汇编语言程序设计课程设计说明书IV在计数单位 count 中,当 count 的计数单位为 18 时,sec 计数单位加 1,当 sec计数值达到 60 时,min 计数单位加 1,因为输入一个句子无论如何不会达到小时级,所以 hours 计数值得调整判断,实际上只起到退出计时器的作用。加入一个显示菜单程序,使得原来的程序具有观赏性;显示时间的子程序disptime 分别将各计时单位的二进制数转化为十进制,并以 min:sec:msec 的形式出来。其中 msec 是由 count 中的计数值转化成的。Count*1s/18.2=
6、count*55ms此式中,18.2 是计算机系统中产生的一个中断,每秒 18.2 次。2 主模块框图程序的核心模块是打字计时,通过显示的例句进行打字练习,最后显示打字时间,主题流程图如下:a. 建立汇编源程序通过 b.编译为目标文件d.连接执行文件c.不通过,重新修改(语句错误) e.运行f.不正确,用调试工具调试,重新修改(逻辑错误) g.正确完成盐城工学院汇编语言程序设计课程设计说明书52程序流程图2.1主程序流程图、开始定义堆栈段、数据段显示提示信息显示 addresssi例句读取系统时间并保存输入字符串,存在 buff 区mov si,0Si+2Si5?再次读取系统时间计算所用时间,
7、调用时间函数,并显示调用正确率计算函数正确率为10?N结束NNY显示正确率输入的是 1? YY盐城工学院汇编语言程序设计课程设计说明书6图 1 主程序流程图主程序的流程图如图 1 所示:说明:首先定义堆栈段,数据段,代码段等,初始化。显示提示信息提示打字练字的规则,说明如何开始,如何退出等。显示出字符串后,开始读取系统时间并保存。然后输入字符串存到指定的缓冲区。输入结束后,再次读取系统时间,并由两次所读取的时间计算出输入字符串所用的时间并显示。调用正确率计算函数,并显示在屏幕上。看输入字符串对应位正确的个数是不是十个,如果是十个,则继续往下,看输入的是不是退出键 1,如果是,则退出。如果不是,
8、则继续下一串字符的练习。如果输入正确的个数不是十个,则返回继续该字符串的练习,指导最后输入的正确个数是十个。2.2时间计算流程图计算时间的流程图如图 3 所示:说明:第一次读取系统时间后,分和秒分别存在了 second 和 minutes 里,第二次读取系统时间后,比较 DH 里的内容和 second 里的内容,比较结果是second 里的内容比较小,则不用向分借位,直接进行减法运算,并把计算结果转换成 ASCII 码并在屏幕上显示。如果比较的结果是 second 里的内容是比较大,则进行减法运算时,要向分借位,所以,将 DH 寄存器的内容加上 60,再与second 里的内容进行减法运算,最
9、后把运算结果转化成 ASCII 码,并显示在屏幕上。盐城工学院汇编语言程序设计课程设计说明书7图 3 时间计算流程图2.3正确率计算流程图正确率显示函数的流程图如图 4 所示:说明:调用争取率判断子程序,首先保护现场,BX 指向字符串 ADDRESSSI首地址,BX+2,指向第一个要显示的字母,DI 指向输入缓冲区的首地址,CX 寄存器存入十,控制循环次数。比较BXHE DI里的内容,即判断显示的和输入的字母是否相同。如果相同,计数寄存器 AL 内容则加一,BX 加一,DI 加一,继续下次比较,直到十次循环结束。如果不相同,则计数寄存器 AL 内容不变,BX加一,DI 加一,继续下一次循环,知
10、道十次循环结束。当十次循环结束后,即DOS 的 2CH 号调用读取系统时间将分和秒分别存在 second 和 minute 中DOS 的 2CH 号调用读取系统时间SF=1CMP DH,secondYNDH 寄存器内容加 60寄存器 DH 内容second 内容计算结果转化称 ASCII 码并输出在屏幕上盐城工学院汇编语言程序设计课程设计说明书8字符串输入结束后,寄存器 AL 里的内容就是输入正确的个数,AL 高四位是输入正确数的十位,低四位是输入正确数的个位,将十位和个位分别转化成ASCII 码,并将其存入字符串中,调用 DOS 的 9 号功能输出字符串,输出的就是屏幕显示的字符串和输入的十
11、位字符串对应位相同的个数,然后恢复现场。每调用一次正确率判断函数,SI 加二,即第一次调用该子程序屏幕上显示的是第一组字符串,第二次调用,当 SI 大于 5 时,就退出程序。保护现场BX 指向 ADDRESSSID 首地址DI 指向输入缓冲区的首地址BX+2BX的内容送入 DLCMP DL,DIZF=1?AL+1BX+1,DI+1CX=0?AX 高八位置零AX 除以 10商转化称 ASCII 码并送入寄存器 BH 中余数转化称 ASCII 码并送入寄存器 BL中恢复现场YNNY返回盐城工学院汇编语言程序设计课程设计说明书9图 4 正确率显示函数的流程图3.设计关键问题在打字练习汇编语言程序设计
12、中,主要有三个问题,分别为输入和输出问题、输入字符串时间的计算、正确率的判断。3.1输入输出3.1.1 输出显示信息输出字符串,主要是利用 DOS 的 9 号功能调用。当开始打字练习时,要输出提示信息说明打字练习时的规则,其程序为: message db 0ah,0dh, Welcome to WUHAN UUIVERSITY, Please type 10 letters, and you must input 10 right words, then press any key to practice the next one db 0ah,0dh, if you want to quit
13、, press 1 ,0ah,0dh,$lea dx,messagemov ah,9int 21h显示信息输出后,要显示预先存在缓冲区的三组字符串,显示字符串用DOS9号调用,其程序为:str1 db 0ah,0dh,wuhanunivedb 0dh,0ah,$str2 db 0ah,0dh,hubeichinadb 0ah,0dh,$str3 db 0ah,0dh,qmpzwmoxid盐城工学院汇编语言程序设计课程设计说明书10db 0ah,0dh,$address dw str1,str2,str3mov dx,offset addresssimov ah,9int 21h 只有当输入的字
14、符串中的十个字符全部正确时,则显示进入下一字符串的练习并输出鼓励语,其程序为:et db 0dh,0ah,Congratulations, Well done!,0ah,0dh,$mov dx,offset etmov ah,09hint 21h当要显示输入字符串所用的时间以及显示输入字符串个数时,可以采用单个字符的输出,但是为了在屏幕上看起来直观,就把要显示的时间和正确个数的十位和个位分别存在缓冲区,并把缓冲区的内容采用9号调用输出在屏幕上,其程序为:(1) 显示输入字符所用的时间的程序time db 2 dup(?),$mov time0,ah ;输入字符串所用时间的十位送入time0mo
15、v time1,al ;输入字符串所用时间的个位送入time1mov dx,offset time ;显示time中的内容mov ah,9int 21h(2) 显示输入字符串正确个数的程序为:num db 2 dup(?),$mov num0,bh ;输入字符串正确个数的十位送入num0mov num1,bl ;输入字符串正确个数的个位盐城工学院汇编语言程序设计课程设计说明书11送入num1mov dx,offset num ;显示num中的内容mov ah,9int 21h3.1.2 输入十个字符当屏幕显示出要练习字符串时,就要输入十个字符存到指定的缓冲区中,使用 DOS 1 号功能调用,其
16、功能是输入单个字符,输出参数是 AL=输入字符的ASCII 码,循环十次,将十个字符存入指定的缓冲区 buff 中,其程序为:buff db 15 dup(?)mov cx,10 ;cx=10,控制循环次数mov bx,0again: mov ah,1 ;输入单个字符int 21hmov buffbx,al ;将输入的字符存到指定的缓冲区inc bxloop again3.2 输入字符串所用时间计算对输入字符串时间的计算,需要知道输入字符串前的时间和输入字符串后的时间,将两者相减,即得输入字符串所用的时间。具体为:当显示第一串字符串后,调用 DOS 的 2CH 号功能读取系统时间,读取完系统时
17、间后,系统时间的时、分和秒分别存在寄存器 CH、CL、DH 中。并将 CL 和 DH 的内容保存到 minutes 和 second 中,以便计算输入字符串所用时间用;第一次读取系统时间后,开始输入 10 个字符,当输入字符结束后,再次读取系统时间,首先第二次的分钟数减去第一次的分钟数,如果结果大于零,则盐城工学院汇编语言程序设计课程设计说明书12用第二次的秒数减去第一次的秒数,所得的结果转化称 ASCII 码显示在屏幕上,即为输入字符串所用的时间。如果第二次的分钟数减去第一次的分钟数的结果小于零,则第二次的秒数加上 60 后,再减去第一次的分钟数,所得结果妆化称ASCII 码后显示在屏幕上,
18、则为输入字符串所用的时间。计算输入字符串所用的时间,其程序为:time1 db the time you have spent is:,$time2 db second,$time db 2 dup(?)mov ah,2ch ;读取系统时间,时分秒分别存在CH CL DHint 21hmov minute,cl ;保存第一次系统时间的分和秒mov second,dh mov ah,2ch ;读取系统时间int 21hsub cl,minute ;计算输入字符串所用时间mov minute,clcmp dh,secondjb a2jmp gettimea2: add dh,60dec minut
19、egettime:sub dh,secondmov second,dhlea dx,time1mov ah,09h盐城工学院汇编语言程序设计课程设计说明书13int 21hcall timechange ;调用timedchangemov time0,ah mov time1,almov dx,offset time ;显示输入10个字符所用时间mov ah,9int 21hlea dx,time2mov ah,09hint 21h3.3 正确率判断正确率的判断前提是,首先要有比较的对象,题目中给定的字符串,其次要有练习者输入的字符串,并且要存到指定的即缓冲区,然后,用两个寄存器分别指向要比较
20、和被比较字符串的首地址,首先比较第一个字符是不是相等,如果相等,计数寄存器加一,两指针寄存器各自加一,开始下一轮比较,知道十次比较结束,将计数寄存器的内容转化称ASCII码输出,结果即为输入字符的正确数。其程序如下所示:judge proc nearpush cx ;保护现场push dxxor al,allop: mov bx,offset addresssi ;bx指向addresssi的首地址add bx,2mov di,offset buff ;di指向buff的首地址盐城工学院汇编语言程序设计课程设计说明书14mov cx,0bh lp2: mov dl,bx ;看bx和di的内容是
21、否相同cmp dl,dijnz next1 inc al ;计数寄存器加一next1: inc bxinc di loop lp2cbwmov cl,10div clmov bl,ah ;保存余数mov dl,al ;将商转化称ASCII码add dl,30hmov bh,dlmov dl,bl ;将余数转化称ASCII码add dl,30hmov bl,dlxor al,alpop dx ;恢复现场pop cxretjudge endp盐城工学院汇编语言程序设计课程设计说明书154.调试运行结果分析当汇编连接运行完程序后,屏幕显示如图5所示:其显示的是提示信息以及第一串字符串wuhanuni
22、ve,等待进行打字练习者从键盘输入10个字符。图4 编译连接运行结果当打字练习者从键盘输入10个字符后,第二次读取系统时间后,计算出输入10个字符所用时间并显示,计算出正确率并显示在屏幕上。盐城工学院汇编语言程序设计课程设计说明书16当输入的 10 个字符为 wuhanyuniv 时,输入正确的个数应该为 5 个,输入后,屏幕显示结果如图 6 所示,正确率为 5,所用时间为 4 秒,结果正确。由于正确率不是 10 个,所以下一组练习还应为第一组字符串 wuhanunive 的练习,即正确率显示结束后所显示的下一组字符练习仍为 wuhanunive,图 5 显示的结果正式如此。图5 输入不完全真
23、确的10个字符运行结果当输入 10 个完全正确的字符后,显示时间后,还显示输入正确的个数为10,并显示出提示语,提示练习者可以进行下一组字符串的联系了,同时显示出下一组练习字符为第二组字符串 hubeichina,结果如图 6 所示:盐城工学院汇编语言程序设计课程设计说明书17图6 输入10个完全正确字符显示结果第一组的 10 个字符完全输入正确后,如果想退出练习,则按 1,退出练习;若想继续下一组练习,则按任意键,屏幕上自动直接显示出第二组要练习的字符串 hubeichina,开始第二组打字练习,同上,第二组字符输入完全正确后,按 1 可以退出,按任意键进行第三组打字练习,就不再赘述。第二组
24、打字练字屏幕显示结果如图 7 所示:图 7 第二组字符串练习盐城工学院汇编语言程序设计课程设计说明书185心得体会到这一刻为止,汇编课设就接近尾声了,有兴奋,也有惶恐,兴奋的是任务终于完成了,同时也很担心,自己还站在汇编语言的门口,只是一个初学者。在课程设计的过程中,深刻地觉得汇编语言真的是很神奇,不过这也从侧面说明自己对汇编语言了解的不多。通过本次的汇编语言程序设计课程设计,真的学到了很多东西。是对这学期所学的汇编语言程序设计知识的一个综合和提升。在这次课程设计中,最重要的是编制汇编语言程序的调试。通过这次课程设计,我对汇编语言的调试有了很深刻的了解,当程序出错时,主要是通过调试来找出程序中
25、的错误,当然在调试过程中,遇到很多困难,主要是平时练习不够,没有注意培养汇编语言的调试练习,在做实验时,忽略了对程序的调试。微机的应用已渗透到生活中的方方面面,利用微机,以前难以实现的东西轻而易举地成为现实。所以,作为工科学生,要了解微机的内部结构、系统构成、指令系统、输入输出接口、存储器和接口的扩展等等,这些对我们来说非常重要。 汇编语言程序设计的方法和多模块程序设计。作为最基本的编程语言之一,汇编语言的重要性勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。尤其在和硬件关系非常密切的程序或要提高运算速度的程序,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发
26、挥硬件的性能。这次汇编语言程序设计历时九天,在整整九天的日子里,可以说是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,还学到了很多在书本上所没有学到过的知识。还有我意识到画程序方框图是很有必要的。因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。盐城工学院汇编语言程序设计课程设计说明书19不仅如此,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性的认识上都有了很大程度
27、的提高。总之,这次课程设计让我受益匪浅,使我更加深入地理解了汇编语言程序设计上讲到的各种芯片的功能,以及中断调用,同时加深了对于主要芯片的应用的认识,同时也更加清楚了汇编程序的编写过程和运行过程。这不仅加深和巩固了我们的课本知识,而且增强了我们自己动脑,自己动手的能力。参考文献1 周佩玲,彭虎,傅忠谦编著汇编语言程序设计(基于 16 位机) 北京:电子工业出版社,20052 张雪兰,谭毓安,李元章编著汇编语言程序设计(从 DOS 到Windows) 清华大学出版社,20063 杨季文等编著80x86 汇编语言程序设计教程清华大学出版社,19984马力妮80x86 汇编语言程序设计北京:机械工业
28、出版社,2004 5曹加恒,苏光奎,许先斌新一代汇编语言程序设计北京:高等教育出版社,2003 附录附录一 打字计时练习程序stack segment para stack stackdb 256 dup(0)stack endsdata segment message db 0ah,0dh, Welcome to WUHAN UUIVERSITY, Please type 10 letters, and you must input 10 right words, then press any key to practice the next one 盐城工学院汇编语言程序设计课程设计说明书
29、20db 0ah,0dh, if you want to quit, press 1 ,0ah,0dh,$str db 0ah,0dh,$str1 db 0ah,0dh,wuhanunivedb 0dh,0ah,$str2 db 0ah,0dh,hubeichinadb 0ah,0dh,$str3 db 0ah,0dh,qmpzwmoxiddb 0ah,0dh,$address dw str1,str2,str3time1 db the time you have spent is:,$time2 db second,$number db the right number is:,$buff
30、db 15 dup(?)minute db (?)second db(?)time db 2 dup(?),$num db 2 dup(?),$et db 0dh,0ah,Congratulations, Well done!db 0ah,0dh,$data endscode segmentassume cs:code,ds:data,ss:stackstart:mov ax,datamov ds,axlea dx,message ;显示提示信息mov ah,9int 21hmov si,0lp1: mov dx,offset addresssi ;显示给定字符串mov ah,9int 21h
31、 mov ah,2ch ;读取系统时间int 21hmov minute,cl ;保存第一次系统时间的分和秒mov second,dh lea dx,str ;显示回车换行mov ah,09hint 21h mov cx,10 ;cx=10,控制循环次数mov bx,0again: 盐城工学院汇编语言程序设计课程设计说明书21mov ah,1 ;输入单个字符int 21hmov buffbx,al ;将输入的字符存到指定的缓冲区inc bxloop againlea dx,strmov ah,09hint 21h mov ah,2ch ;读取系统时间int 21hsub cl,minute ;
32、计算输入字符串所用时间mov minute,clcmp dh,secondjb a2jmp gettimea2: dec minuteadd dh,60gettime:sub dh,secondmov second,dhlea dx,time1mov ah,09hint 21hcall timechange ;调用timechange子程序mov time0,ah ;保存输入字符所用时间的十位送入mov time1,al ;保存输入字符所用时间的个位mov dx,offset time ;显示time中的内容mov ah,9int 21hlea dx,time2mov ah,09hint 21
33、hlea dx,strmov ah,09hint 21h mov dx,offset numbermov ah,9int 21hcall judgemov num0,bh ;保存输入正确个数的十位mov num1,bl ;保存输入正确个数的个位盐城工学院汇编语言程序设计课程设计说明书22mov dx,offset num ;显示num中的内容mov ah,9int 21hcmp bh,31hjnz lp8mov dx,offset et ;显示et中字符串mov ah,09hint 21hlea dx,strmov ah,09hint 21hnext: mov ah,08h ;调用08H号功能
34、,进行键盘输入判断int 21h cmp al,31h ;是1,则退出je quitadd si,2cmp si,05jl next4next4: jmp lp1lp8:jmp lp1judge proc nearpush cx ;保护现场push dxxor al,allop: mov bx,offset addresssi ;bx指向addresssi的首地址add bx,2mov di,offset buff ;di指向buff的首地址mov cx,0bh lp2: mov dl,bx ;看bx和di的内容是否相同cmp dl,dijnz next1 inc al ;计数寄存器加一nex
35、t1: inc bxinc di loop lp2cbwmov cl,10div cl盐城工学院汇编语言程序设计课程设计说明书23mov bl,ah ;保存余数mov dl,al ;将商转化称ASCII码add dl,30hmov bh,dlmov dl,bl ;将余数转化称ASCII码add dl,30hmov bl,dlxor al,alpop dx ;恢复现场pop cxretjudge endptimechange proc nearpush cxpush dxmov al,second cbwmov cl,10div clmov dh,ah ;保存余mov dl,al ;将商转化称ASCII码add dl,30hmov ah,dlmov dl,dh ;将余数转化称ASCII码add dl,30hmov al,dlpop dxpop cxrettimechange endpquit: mov ax,4c00hint 21hcode endsend start