汇编语言程序设计打字练习程序
- 格式:doc
- 大小:377.50 KB
- 文档页数:24
第四章汇编语言程序设计上机练习及简单程序设计一、汇编语言程序上机过程1、掌握常用工具软件 PE,MASM和LINK的使用。
2、伪指令: SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。
3、利用的 1号功能实现键盘输入的方法。
4、了解.EXE文件和.COM文件的区别及用INT 21H 、INT 4CH号功能返回系统的方法。
程序:data segmentmessage db 'This is a sample program of keyboard and disply'db 0dh,0ah,'Please strike the key!',0dh,0ah,'$' data endsstack segment para stack 'stack'db 50 dup(?)stack endscode segmentassume cs:code,ds:data,ss:stackstart: mov ax,datamov ds,axmov dx,offset messagemov ah,9int 21hagain: mov ah,1int 21hcmp al,1bhje exitcmp al,61hjc ndcmp al,7ahja ndand al,11011111bnd: mov dl,almov ah,2int 21hjmp againexit: mov ah,4chint 21hcode endsend start实验步骤:1、用用文字编辑工具(记事本或EDITPLUS)将源程序输入,其扩展名为.ASM。
2、用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。
若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3、用LINK将.OBJ文件连接成可执行的.EXE文件。
4、在DOS状态下运行LINK产生的.EXE文件。
信息科学与技术学院微机原理与接口技术课程设计课题名称:打字练习程序学生姓名:学号:专业、年级:指导教师:时间:1、题目及要求:1.1、题目:打字练习程序1.2、要求:1)、缓冲区中预放了一些字母2)、运行时,可按照屏幕上显示的字母输入练习3)、当按结束,可显示出练习输入的时间,并且能显示出正确率。
4)、要求界面美观。
2、功能设计:2.1、功能模块:主程序模块-----主要是随机产生字符并将字符送入缓冲区,调用其他子程序和宏设置窗口及时间、字符总数和正确个数。
打字结果计算与显示模块( UseTimeAndOut,RightRata_out)-----主要计算所用时间及正确率并输出。
设置字符颜色模块(clew_char)-----主要设置打字时缓冲区字符和打字区字符的颜色,包括错误时字符的颜色显示。
字符满行处理模块(isFullLine)-----主要功能是当字符输入满行时进行换行。
输出模块(OutTime,btod_out)-----输出程序运行时的时间。
统计模块(Tongji)-----统计字符个数和正确个数并记录时间。
宏的作用:清屏(Clear)----- 用于按要求清理屏幕(不同颜色),以便产生想要的窗口。
设置光标位置(SETGB)-----用于移动光标位置,以便按要求输出。
读光标位置(READGB)-----用于读取当前光标位置。
提示(Tishi)-----用于输出提示语句。
2.2、功能图:图1 功能图3、详细设计:3.1、设计方法:根据设计要求,该课程设计只应用了些简单的函数调用,中断,宏调用。
其中随机产生字符的实现是通过调用中断(ah=2ch,int 10)取系统时间的1/100 来得到一组随机数,把这些随机数当做指针,然后取指针对应的字符表中相应的字符,得到一串字符。
在把结果显示到屏幕上时将数据拆分后输出到屏幕上。
如‘123’在屏幕上显示时必须一个一个输出,还有在输出小数点时也采取了相应的办法。
课程设计说明书题目: 打字练习摘要在IBM-PC系统中,驻留的ROM中有8KB的BIOS。
它实现对系统中种种常用设备的输入输出操作的管理。
其中的16H中断调用即为键盘输入输出中断调用,实现从键盘输入字符到AL寄存器、读键盘缓冲区字符到AL寄存器、读取特殊功能键的状态等功能。
本程序是一个在键盘上打字练习的程序,运行可执行程序后,出现主界面,按回车键出现由78个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC 健返回主界面;按空格键暂停;按’E’退出。
关键词:中断调用,打字练习,回车键进入,空格键暂停目录1设计目的 (1)2概要设计 (2)2.1 系统总体分析 (2)2.2 主模块框图及说明 (2)3详细设计 (4)3.1 主模块及子模块说明 (4)3.2 各模块详细设计 (4)4程序调试 (10)4.1 运行界面分析 (10)4.2 调试过程及分析 (12)5心得体会 (13)5.1 设计体会 (13)5.2 系统改进 (13)参考文献 (14)1设计目的汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。
由于汇编语言如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。
由此可见汇编语言的重要性,学好这门课程,同样可为相关的专业打下基础。
汇编语言程序设计课程设计是在教学实践基础上进行的一次试验,也是对该课程所学理论知识的深化和提高。
因此,要求学生能综合应用所学知识,设计和制造出具有具有一定功能的应用系统,并且在实验的基本技能方面进行了一次全面的训练。
此外,它还可以培养学生综合运用所学知识独立完成汇编程序课题的能力,使学生能够较全面的巩固和应用课堂上所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。
再者,它同样可以提高学生运用理论去处理实际问题的能力和独立思考的能力,使学生的编程思想和编程能力有所提高,最终达到熟练地掌握编写汇编源程序的基本方法的目的。
摘要这是一个打字计时练习程序,在缓冲区中预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间. 编写打字计时练习这个程序,是为了计算在打字练习时所使用的时间,以此来评估一个人打字的快慢。
编写这个程序时,我们可以这样设想:在键盘上练习的打字例句及其地址表、计时单元等预先放在DATA数据段中,自编的中断程序kbint检测按键时产生的中断,并把按键的扫描码转换为ASCII码存入缓存区buffer,这个工作和ROM09类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时作了简化,即只解释了可显示字符,如英文字母、数字及一些符号;其他特殊键,如组合键、双态键、功能键等都未作解释,只作为字符码0来处理。
在主程序部分保存原09类型的中断向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后开中断。
当键盘中断处理后,主程序中安排指令读取缓冲区中的字符并显示在屏幕上。
在主程序的末尾,利用DOS功能恢复原09类型的中断向量,然后返回DOS。
在显示键入的字符时,还应判断字符是否为回车(0DH)。
如为回车符,说明一个句子输入完毕,此时调用显示时间的子程序显示出打字时间,然后顺序显示下一个例句。
如果所存放的例句都已显示完,则又从第一个例句开始显示,直至键入某一功能键(如Esc键、Shift键等)退出程序,结束打字练习。
打字时间统计利用自定时器中断处理程序clint来完成。
每输完一例句,计时一次。
在此中断例行程序中,定时器中断的次数记录在计数单元count中,当count计数值为18时,sec计数单元加1 ,当sec计数值达到60时,min计数单元加1 。
因为输入完一个句子无论如何也不会达到小时级,所以对hours计数值的调整判断,实际上只起到退出定时器中断的作用。
关键词:打字计时,计时单元,Dos功能调用,定时器中断- 1 -这一段程序的作用是:将原中断向量09H保存在自设的单元中,设置自编处理程序的中断向量,并将中断向量1CH 保存在自设的单元中,还设置自编处理程序的中断问题,并设置显示方式。
课程设计说明书题目: 打字练习院系:专业班级:学号:学生姓名:指导教师:2010 年 12 月 31 日安徽理工大学课程设计(论文)任务书计算机科学与工程学院硬件教研室ﻩ2010年12月17日安徽理工大学课程设计(论文)成绩评定表摘要汇编语言是计算机能够给用户使用的最高效快捷的语言,也是唯一能对计算机所有硬件进行操纵的语言。
鉴于汇编语言的用途广泛以及重要性,我花费的大量的时间完成此次课程时机,打字练习。
打字练习是计算机常用的小应用程序,可以给想练习打字的人提供一个好的练习空间。
本文的核心部分是对于详细设计的讲解与分析,而这当中的侧重点又在于设计思想的再现。
关键词:功能模块,核心代码,随机字符,模块调用,功能分析目录1设计目的ﻩ错误!未定义书签。
2概要设计 .......................................................................... 错误!未定义书签。
2.1系统总体分析 ...................................................................................................... 错误!未定义书签。
2.2主模块框图及说明ﻩ错误!未定义书签。
3 详细设计 ......................................................................... 错误!未定义书签。
3.1主模块及子模块说明 ........................................................................................ 错误!未定义书签。
3.2各模块详细设计ﻩ错误!未定义书签。
3.2.1主界面模块.................................................................................................. 错误!未定义书签。
目录1 方案论证 (1)1.1题目要求 (1)1.2算法说明 (1)1.2.1输入/输出算法 (1)1.2.2时间计算算法 (2)1.2.3正确率计算算法 (2)2程序流程图 (3)2.1主程序流程图 (3)2.2时间计算流程图 (4)2.3正确率计算流程图 (5)3.设计关键问题 (7)3.1输入输出 (7)3.1.1 输出显示信息 (7)3.1.2 输入十个字符 (8)3.2 输入字符串所用时间计算 (9)3.3 正确率判断 (10)4.调试运行结果分析 (12)心得体会 (15)参考文献 (16)附录 (17)打字练习汇编语言程序程序设计1 方案论证1.1题目要求本次《微机原理与接口技术》课程设计的题目是打字练习汇编语言程序设计,要求在屏幕输出提示信息及一串有十个字符的字符串的同时开始记录系统时间,当输入十个字符后,再次记录系统时间,计算输入字符串的时间,及输入字符串的正确率,并将最终结果显示在屏幕上。
只有完全正确才能进入下一字符串的练习,并最后显示赞赏提示信息,否则,继续练习该字符串的输入,知道全部输入正确;一串字符串输入结束后,如果不想继续打字练习,则按‘1’退出打字练习如果想继续进行打字练习,则按任意键进入下一字符串的练习,直到练习完三串字符串,按‘1’退出。
1.2算法说明打字练习汇编语言程序设计的主要算法是进行时间的计算和正确率的判断,并将最后结果显示在屏幕上。
1.2.1输入/输出算法DOS功能调用的过程为:首先,将DOS功能调用号送入寄存器AH中,其次,如果序言按要求给定输入参数(有的不需要输入参数),最后,写入终端指令INT21H。
DOS的输入输出包括单字符输入输出和多字符输入输出。
(1)单字符输入输出算法单字符的输入,是DOS的01H号功能调用,没有输入参数,输出参数是AL=要输入字符的ASCII码。
单字符的输出,是DOS的02H号功能调用,输入参数为DL=要输出的字符的ASCII码,无数除参数。
课程设计2013~ 2014学年第二学期设计题目汇编语言程序设计课程设计-打字练习程序的设计院(系)计算机科学与信息工程学院专业网络工程提交日期 2014年7月5日上海应用技术学院课程设计任务书指导教师(签名):教研室主任(签名):杨晶鑫2014年6 月25 日2014年6 月25 日目录上海应用技术学院课程设计任务书..................................................... i错误!未定义书签。
目录.................................................................................................................................... i ii 1概述. (1)1.1基本功能 (1)1.2拓展功能 (1)1.3代码的格式 (1)2详细设计说明 (4)2.1原“TYPETEST.ASM”程序结构 (4)2.2已经实现的功能(修改的、新编写的)程序结构 (5)2.3各模块功能 (7)2.3.1用户验证模块: (7)2.3.2功能选择模块: (9)2.3.3游戏选择模式: (12)2.3.4游戏模块: (15)2.3.5游戏结束模式: (22)2.3.6退回主菜单: (23)3课程设计总结 (25)3.1设计体会 (25)3.2系统改进 (25)4软件使用说明 (26)4.1用户密码: (26)4.2运行环境: (26)4.3使用方法 (26)参考文献 (34)附录 (35)源代码: (35)1 概述本次课程设计主要是设计一个打字游戏,通过对一个较大型的、综合性的应用程序进行阅读、修改、添加功能等工作, 加深对汇编语言程序设计的认识,提高阅读理解复杂程序的能力和程序设计能力。
本程序运行后,出现主界面,按回车键出现由26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC键返回主界面;按空格键暂停;按‘E’退出;程序包括自动计分功能,根据打字的快慢分别获得不同的分数,根据打字的难度,分别变化不同的颜色,并且设置了用户名和密码,使软件运行起来更加安全。
学号:课程设计题目打字练习计时程序设计学院专业班级姓名指导教师2014 年月日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 打字计时练习程序设计要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.用汇编语言编写一个打字计时练习的程序,在缓冲区中预放一些字母,运行时,可按照屏幕上显示的字母输入练习。
2.按某个键开始练习,每输入完一行按回车键后,可显示出练习的时间及正确率。
3.撰写课程设计说明书。
内容包括:摘要、目录、正文、参考文献、附录(程序清单)。
正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。
时间安排:12月30日-----12月31日查阅资料及方案设计1月2日-----1月3日编程1月6日调试程序1月7日-----1月8日撰写课程设计报告指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (1)1.设计要求 (2)1.1设计任务 (2)1.2设计要求 (2)1.3设计目的 (2)2.算法设计 (3)2.1设计思路 (3)2.2程序流程图 (3)3设计说明 (5)3.1BIOS中断 (5)3.1.1显示输出管理 (5)3.2DOS中断 (6)3.2.1DOS中断 (6)3.2.2 DOS中断和BIOS中断使用方法 (6)4.程序说明 (8)4.1计算正确率子程序 (8)4.2键盘获取子程序 (9)5.调试与运行 (11)5.1运行程序: (11)5.2调试中出现的问题 (12)6.总结 (13)参考文献 (14)附录 (15)摘要计算机的不断更新发展,在各个领域的应用越来越多。
而汇编语言是计算机能够提供用户使用的最快而又最好最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。
因而,对程序的空间和时间要求很高的场合,汇编语言的应用就显得必不可少了,一些直接控制硬件的应用场合,则更是非用汇编语言不可。
===========================================================4月28日1、从键盘输入一个数n ( 1<=n<=9 ),然后屏幕上显示连续的n个“+”号。
例如,当键盘输入的是5时,屏幕上显示+++++2、从键盘输入一个字母,然后程序使得屏幕再出现该字母之后的5个后继字母。
例如:键盘输入的是m,则屏幕上除了m外,还出现nopqr。
===========================================================5月5日1、编程:在屏幕上显示如下字符:1234567123456712345672、[选做] 一个2位数( 11-99 ),个位数与十位数之和为12,求所有符合要求的数。
并显示出来,格式如下:3948.... (省略掉若干行)93提示:用两重循环来做,循环体中判断个位数与十位数是否满足条件,如果满足,则显示出来,并换一行。
===========================================================5月12日1、一个2位数( 11-99 ),个位数的2倍与十位数之和为15,求所有符合要求的数的个数并在屏幕上显示出个数。
提示:共有17,36,55,74,93等5个值。
2、[选做] 键盘输入两个小写的英文字母,编程实现在其下一行显示出这两个字母之间的所有字母。
(要考虑输入的时候,字母的大小关系)。
例1:bg (这是键盘输入的)cdef (这是软件显示的)例2:kh (这是键盘输入的)ij (这是软件显示的)===========================================================5月19-21日1、键盘输入有序的两个小写的英文字母(即第1个字母比第2个字母的ASCII值小),编程实现在其下一行显示出这两个字母之间的所有字母。
Init_boarder macro row,col,char,dhdl,countLocal l1mov cx,countmov dh,rowmov dl,coll1:mov ah,02hmov bh,00hint 10hpush cxmov ah,0ahmov al,charmov bh,00hmov cx,01hint 10hpop cxinc dhdlloop l1endmclear_screen macro top,left,bottom,right,col;清屏宏定义 mov ah,06hmov al,00hmov bh,colmov ch,topmov cl,leftmov dh,bottommov dl,rightint 10hendmsetcusor macro page,row,column;设置光标位置mov ah,02hmov bh,pagemov dl,columnmov dh,rowint 10hendmmenu macro row,col,text;菜单显示宏定义mov ah,02hmov bh,00hmov dh,rowmov dl,colint 10hmov cx,0mov ah,09hlea dx,textint 21hendmdata segment; add your data here!;pkey db "press any key...$"kaishi db " welcome to play the game! $"mes0 db " =========================================$"mes1 db " 1.start game $"mes2 db " 2.select $"mes3 db " 3.exit $"mes4 db " =========================================$"mes5 db " select num of menu:$"mes12 db " =========================================$"mes13 db " 1.100 letters $"mes14 db " 2.200 letters $"mes15 db " 3.300 letters $"mes17 db " =========================================$"mes18 db "Correct Rate:$"mes7 db " press any key to start the game... $"mes8 db " press esc key return main menu $"mes10 db " Select The Letter's Num $"mes19 db " wait... $"mes11 db " when the game was over,press enter to restart$"mes9 db "Used Time:$"mes6 db "The correct number:$"col db 00h,24h,0fdh,0dh;颜色num dw ? ;以输入字母的个数numb dw ? ;输入正确字母的个数score dw ? ;每轮游戏的分数grade dw ?sum dw ?n db 26letters db 500 dup(0)hour db 0minu db 0seco db 0endsstack segmentdw 128 dup(0)endscode segmentstart:; set segment registers:mov ax, datamov ds, axmov es, ax; add your code here;clear_screen 0d,0d,24d,79d,07hFrame1:clear_screen 0d,0d,24d,79d,1eh ;清屏Init_boarder 0d,0d,'*',dl,80d ;显示边框上一排星号Init_boarder 24d,0d,'*',dl,80d ;显示边框下一排星号 Init_boarder 0d,0d,'*',dh,25d ;显示边框左一排星号 Init_boarder 0d,79d,'*',dh,25d ;显示边框右一排星号 menu 5d,20d,mes0menu 6d,26d,kaishi ;显示菜单menu 8d,30d,mes1menu 10d,30d,mes2menu 12d,30d,mes3menu 13d,20d,mes4menu 14d,20d,mes5inputMenuNum:mov ah,7 ;输入功能号,无回显int 21hcmp al,'1'je call num1cmp al,'2'je call num2cmp al,'3'je end1jmp inputMenuNum ;输入不符要求重输Frame2 procmov dl,al ;将选择的功能号显示出来mov ah,2int 21hclear_screen 1d,1d,23d,78d,1eh ;清屏,边框还存在menu 9d,20d,mes7menu 11d,20d,mes8; menu 12d,30d,mes10menu 13d,20d,mes11mov cx,2000h ;隐藏光标mov ah,01h ;设置光标大小int 10hmov ah,7 ;无回显输入字符int 21hmov cx,1010h ;显示光标mov ah,01hint 10hretFrame2 endpnum1 procmov dl,al ;将选择的功能号显示出来mov ah,2int 21hclear_screen 1d,1d,23d,78d,1eh;清屏,但边框存在menu 9d,20d,mes7menu 11d,20d,mes8;menu 12d,30d,mes10menu 13d,20d,mes11mov cx,2000h ;隐藏光标mov ah,01hint 10hmov ah,7 ;无回显输入字符int 21hmov cx,1010h ;显示光标mov ah,01hint 10hmov num,100call playretnum1 endpnum2 procmov dl,al ;将选择的功能号显示出来 mov ah,2int 21hclear_screen 1d,1d,23d,78d,1eh;清屏 menu 7d,20d,mes10menu 8d,20d,mes12menu 10d,20d,mes13menu 11d,20d,mes14menu 12d,20d,mes15menu 14d,20d,mes17menu 15d,20d,mes5inputMenuNum1:mov ah,07hint 21hcmp al,'1'jz m1cmp al,'2'jz m2cmp al,'3'jz m3cmp al,27 ;当输入esc键时退到主菜单 jz Frame1jmp inputMenuNum1m1:call Frame2mov num,100 ;设置字符串个数为100call playjmp m4m2:call Frame2mov num,200call playjmp m4m3:call Frame2mov num,300call playjmp m4m4: retnum2 endpplay procmov numb,0 ;正确字符个数clear_screen 02d,02d,23,78,1eh ;清屏(边框还存在) lea si,lettersmov bx,0call getletter ;调用生成字符串子程序menu 20d,15d,mes19setcusor 0d,3d,10d ;设置光标位置clear_screen 02d,02d,23,78,1eh ;清屏(边框还存在) call outlettersetcusor 0d,4d,10d ;设置光标位置mov ah,2ch ;获取当前时间int 21hmov hour,ch ;获取的小时放入hour中mov minu,cl ;获取的分钟放入minu中mov seco,dh ;获取的秒钟放入seco中call inputlettermenu 20d,5d,mes9call counttimecall outtimemenu 20d,25d,mes6mov ax,numbcall PRINTAXmenu 20d,50d,mes18call CorrectRateinput_quit:mov ah,07hint 21hcmp al,27jz Frame1cmp al,0dhjz call playjmp input_quitretplay endp;*************************************;实现随机产生字符串getletter procoutput_letter:mov ah,2ch ;获取时间 ch为小时,cl为分,dh为秒,dl为1%秒int 21hmov al,dl ;将1%秒放入al中mov ah,0 ;将ah置0,ax当被除数div n ;n为26,将商放到al中,将余数放入ah中mov dl,ah ;将余数放入dl中add dl,61h ;a的ascii码为61,将余数加上61得到随机产生字母的ascii码mov [si],dl ;将随机产生的字符放入到letters中inc si ;letters的偏移量加1inc bxcall DELAY ;计数量加1cmp bx,num ;将已产生的字符量与所需产生的字符数比较jnz output_letter ;当小于所需产生的字符数时,跳转至output_lettermov [si],'$' ;字符串结束retgetletter endp;*************************************;实现字符串的换行输出outletter proclea si,letters ;获取letters的首地址again:mov dl,[si] ;将字符串相应偏移地址里的字符放入dl 中mov ah,02h ;显示字符int 21hinc si ;letters偏移地址加1cmp [si],'$' ;判断是否已经到字符串的末尾jz q2 ;当已到达字符串末尾时跳转至q2,反之顺序执行mov ah,03h ;获取光标当前位置 dh=行号,dl=列号 mov bh,0int 10hcmp dl,75d ;判断光标列号是否为75,即已到达改行末尾jz q1 ;当光标列号是为75跳转至q1jmp againq1: add dh,2d ;将当前光标行号加2,实现隔行输出setcusor 0d,dh,10d ;重新设定光标位置jmp againq2: retoutletter endpinputletter proclea si,letters ;获取字符串的首地址mov cx,num ;将字符串的长度放入cx中input:push cx ;将cx压栈mov ah,03h ;获取光标当前位置 dh=行号,dl=列号 mov bh,0 ;页号为0int 10hcmp dl,75d ;将光标当前列号与75作比较jz l5 ;当光标当前列已是75则跳转到l5l6: mov ah,7 ;输入字符无回显,al接收输入字符的ascii 码int 21hcmp al,08h ;判断输入键是否为退格键(退格键ascii 码为08h)je l3 ;当输入退格键跳转至l3,若不是则往下执行cmp al,27 ;判断输入键是否为esc键(esc键ascii 码为27h)je quit ;当输入的是esc键,跳转至qiut,若不是则往下执行cmp al,[si] ;将输入字符与letters里相应字符比较je l1 ;当相等时跳转至l1,反之往下执行jne l2 ;当输入的字符与letters里相应字符不相等,跳转至l2done: mov dl,al ;将输入的字符放入dl中mov ah,2 ;输出字符int 21hinc si ;letters的偏移量加1pop cxdec cxjnz inputjmp l4l1: add numb,1 ;输入的字符正确,记录输入输入正确个数的numb加1mov ah,09H ;在当前光标位置显示字符,不改变光标位置mov bh,0Hmov bl,2fh ;背景颜色为绿色mov cx,1int 10Hjmp donel2:call SOUND ;输入错误mov ah,09H ;在当前光标位置显示字符,不改变光标位置mov bh,0Hmov bl,4fh ;Z表示颜色。
汇编语言课程设计报告( 2014 -- 2015 年度第 1 学期)课题名称:打字计时练习程专业xxx学生姓名xxxx班级xxx学号xxxx指导教师xxx完成日期xxxxx目录1.设计目的与设计要求2.程序流程图 (6)2.1主程序流程图 (6)2.2时间计算流程图 (7)2.3正确率计算流程图 (8)3.设计关键问题 (10)3.1输入输出 (10)3.1.1 输出显示信息 (10)3.1.2 输入十个字符 (12)3.2 输入字符串所用时间计算 (12)3.3 正确率判断 (14)4.调试运行结果分析 (16)参考文献 (20)附录二打字计时练习程序 (20)一.设计目的本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题,解决问题的综合应用能力。
设计要求在缓冲区预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间。
设计思路1.系统总体分析在缓存区预放了一些字母,运行时可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间。
当一个句子分析完后(回车键作为结束符),屏幕上以min:sec:msec的格式显示出键入字符的时间。
在每次打字之前,屏幕上先显示一个例句,然后打字员按照例句,将句中字符通过键盘输入。
这个过程共进行五次,当键入一个enter键时,推出打字计时练习程序。
在键盘上联系的打字例句及其他地址表,计时单位等预存在DATA数据段中。
自编的中断程序Kbint检测按键时产生的中断,并将按键扫描码转换为ASCII码存入缓存区BUFFER(内存中一个区域),这个工作和EOM09类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时作了简化,即只解释了可显示字符(如英文小写字母,数字及一些字符),其他特殊键(如组合键,双态键,功能键),都未做解释,只做字符码0来处理。
在主程序部分保存原有09类型的中断向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后在开断。
当键盘中断处理后,主程序安排指令读取缓存区中的字符并显示在屏幕上。
在主程序的末尾,利用DOS功能恢复原09类型的中断向量,然后返回DOS。
在显示键入的字符时,还应判断字符是否为回车符。
说明一个句子输入完毕,此时调用显示时间的子程序显示打字时间,然后顺序显示一个例句。
如果所存放的例句都已显示完毕,则再次从第一个例句开始显示,直至键入某个功能(如ESC键等)退出程序,结束打字练习。
打字时间统计利用自编的计时器中断处理程序Clint来完成。
每输入一个例句,计时一次。
在此中断例行程序中,定时器中断的次数记录在计数单位count中,当count的计数单位为18 时,sec计数单位加1,当sec计数值达到60时,min计数单位加1,因为输入一个句子无论如何不会达到小时级,所以hours计数值得调整判断,实际上只起到退出计时器的作用。
加入一个显示菜单程序,使得原来的程序具有观赏性;显示时间的子程序disptime分别将各计时单位的二进制数转化为十进制,并以min:sec:msec的形式出来。
其中msec是由count中的计数值转化成的。
Count*1s/18.2=count*55ms此式中,18.2是计算机系统中产生的一个中断,每秒18.2次。
2.主模块框图程序的核心模块是打字计时,通过显示的例句进行打字练习,最后显示打字时间,主题流程图如下:a. 建立汇编源程序—通过b.编译为目标文件——d.连接执行文件c.不通过,重新修改(语句错误) e.运行f.不正确,用调试工具调试,重新修改(逻辑错误)g.正确完成2程序流程图2.1主程序流程图、图1 主程序流程图主程序的流程图如图1所示:说明:首先定义堆栈段,数据段,代码段等,初始化。
显示提示信息提示打字练字的规则,说明如何开始,如何退出等。
显示出字符串后,开始读取系统时间并保存。
然后输入字符串存到指定的缓冲区。
输入结束后,再次读取系统时间,并由两次所读取的时间计算出输入字符串所用的时间并显示。
调用正确率计算函数,并显示在屏幕上。
看输入字符串对应位正确的个数是不是十个,如果是十个,则继续往下,看输入的是不是退出键1,如果是,则退出。
如果不是,则继续下一串字符的练习。
如果输入正确的个数不是十个,则返回继续该字符串的练习,指导最后输入的正确个数是十个。
2.2时间计算流程图计算时间的流程图如图3所示:说明:第一次读取系统时间后,分和秒分别存在了second和minutes里,第二次读取系统时间后,比较DH里的内容和second里的内容,比较结果是second里的内容比较小,则不用向分借位,直接进行减法运算,并把计算结果转换成ASCII码并在屏幕上显示。
如果比较的结果是second里的内容是比较大,则进行减法运算时,要向分借位,所以,将DH寄存器的内容加上60,再与second 里的内容进行减法运算,最后把运算结果转化成ASCII码,并显示在屏幕上。
图3 时间计算流程图2.3正确率计算流程图正确率显示函数的流程图如图4所示:说明:调用争取率判断子程序,首先保护现场,BX指向字符串ADDRESS[SI]首地址,BX+2,指向第一个要显示的字母,DI指向输入缓冲区的首地址,CX寄存器存入十,控制循环次数。
比较[BX]HE [DI]里的内容,即判断显示的和输入的字母是否相同。
如果相同,计数寄存器AL内容则加一,BX加一,DI加一,继续下次比较,直到十次循环结束。
如果不相同,则计数寄存器AL内容不变,BX加一,DI加一,继续下一次循环,知道十次循环结束。
当十次循环结束后,即字符串输入结束后,寄存器AL里的内容就是输入正确的个数,AL高四位是输入正确数的十位,低四位是输入正确数的个位,将十位和个位分别转化成ASCII码,并将其存入字符串中,调用DOS的9号功能输出字符串,输出的就是屏幕显示的字符串和输入的十位字符串对应位相同的个数,然后恢复现场。
每调用一次正确率判断函数,SI加二,即第一次调用该子程序屏幕上显示的是第一组字符串,第二次调用,当SI大于5时,就退出程序。
图4 正确率显示函数的流程图3.设计关键问题在打字练习汇编语言程序设计中,主要有三个问题,分别为输入和输出问题、输入字符串时间的计算、正确率的判断。
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 anykey to practice the next one 'db 0ah,0dh, 'if you want to quit, press 1 ',0ah,0dh,'$' lea dx,messagemov ah,9int 21h显示信息输出后,要显示预先存在缓冲区的三组字符串,显示字符串用DOS9号调用,其程序为:str1 db 0ah,0dh,'wuhanunive'db 0dh,0ah,'$'str2 db 0ah,0dh,'hubeichina'db 0ah,0dh,'$'str3 db 0ah,0dh,'qmpzwmoxid'db 0ah,0dh,'$'address dw str1,str2,str3mov dx,offset address[si]mov ah,9int 21h只有当输入的字符串中的十个字符全部正确时,则显示进入下一字符串的练习并输出鼓励语,其程序为:et db 0dh,0ah,'Congratulations, Well done!',0ah,0dh,'$'mov dx,offset etmov ah,09hint 21h当要显示输入字符串所用的时间以及显示输入字符串个数时,可以采用单个字符的输出,但是为了在屏幕上看起来直观,就把要显示的时间和正确个数的十位和个位分别存在缓冲区,并把缓冲区的内容采用9号调用输出在屏幕上,其程序为:(1)显示输入字符所用的时间的程序time db 2 dup(?),'$'mov time[0],ah ;输入字符串所用时间的十位送入time[0]mov time[1],al ;输入字符串所用时间的个位送入time[1]mov dx,offset time ;显示time中的内容mov ah,9int 21h(2) 显示输入字符串正确个数的程序为:num db 2 dup(?),'$'mov num[0],bh ;输入字符串正确个数的十位送入num[0]mov num[1],bl ;输入字符串正确个数的个位送入num[1]mov dx,offset num ;显示num中的内容mov ah,9int 21h3.1.2 输入十个字符当屏幕显示出要练习字符串时,就要输入十个字符存到指定的缓冲区中,使用DOS 1号功能调用,其功能是输入单个字符,输出参数是AL=输入字符的ASCII 码,循环十次,将十个字符存入指定的缓冲区buff中,其程序为: buff db 15 dup(?)mov cx,10 ;cx=10,控制循环次数mov bx,0again:mov ah,1 ;输入单个字符int 21hmov buff[bx],al ;将输入的字符存到指定的缓冲区inc bxloop again3.2 输入字符串所用时间计算对输入字符串时间的计算,需要知道输入字符串前的时间和输入字符串后的时间,将两者相减,即得输入字符串所用的时间。
具体为:当显示第一串字符串后,调用DOS 的2CH号功能读取系统时间,读取完系统时间后,系统时间的时、分和秒分别存在寄存器CH、CL、DH中。
并将CL和DH的内容保存到minutes和second中,以便计算输入字符串所用时间用;第一次读取系统时间后,开始输入10个字符,当输入字符结束后,再次读取系统时间,首先第二次的分钟数减去第一次的分钟数,如果结果大于零,则用第二次的秒数减去第一次的秒数,所得的结果转化称ASCII码显示在屏幕上,即为输入字符串所用的时间。
如果第二次的分钟数减去第一次的分钟数的结果小于零,则第二次的秒数加上60后,再减去第一次的分钟数,所得结果妆化称ASCII码后显示在屏幕上,则为输入字符串所用的时间。