汇编设计报告打字计时练习程序.docx
《汇编设计报告打字计时练习程序.docx》由会员分享,可在线阅读,更多相关《汇编设计报告打字计时练习程序.docx(17页珍藏版)》请在冰豆网上搜索。
![汇编设计报告打字计时练习程序.docx](https://file1.bdocx.com/fileroot1/2022-11/16/3983fd54-83d9-4725-9f2f-bacb8229eeae/3983fd54-83d9-4725-9f2f-bacb8229eeae1.gif)
汇编设计报告打字计时练习程序
汇编语言课程设计报告
(2012--2013年度第1学期)
课题名称:
打字计时练习程序
目录
1设计目的1
2概要设计1
2.1系统总体分析1
2.2主模块框图2
3详细设计2
3.1主模块及子模块说明2
3.2各模块详细设计3
3.2.1主界面模块3
3.2.2中断处理模块3
3.2.3打字计时模块5
4程序调试8
4.1运行界面分析8
4.2调试过程及分析10
5心得体会10
5.1设计体会10
5.2系统改进11
参考文献12
附录13
附录1源程序清单13
附录1.1打字计时练习模块源程序13
打字计时练习程序
1设计目的
这次课程的任务是写一个在键盘上练习打字并能统计时间的程序,运行可执行程序后,按回车键出现主界面,进入英文打字练习并计时,通过课程设计,主要达到以下目的:
1.增进对汇编语言的认识,加强运用汇编语言编程的能力;
2.掌握汇编语言的中断调用功能的应用,可以用汇编语言调用各种调用功能,并由此实现对硬件的控制等;
3.了解和掌握汇编语言程序设计过程、方法及实现,为以后微机原理课程的学习打下坚实的基础;
4.通过课程设计可以使我们更加了解书上的知识,了解书上的语句并能用到自己的程序设计中;
5.掌握屏幕输出显示的设计方法。
2概要设计
2.1系统总体分析
在缓冲区中预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间。
当一个句子输入完后(回车键作为结束符),屏幕上以min:
sec:
msec的格式显示出键入字符的时间。
在每次打字之前,屏幕上先显示一个例句,然后打字员按照例句,将句中字符通过键盘输入。
这个过程共进行五次,当键入一个Enter键时,退出打字计时练习程序。
在键盘上联系的打字例句及其地址表、计时单位等预放在DATA数据段中。
自编的中断程序Kbint检测按键时产生的中断,并把按键扫描码转换为ASCII码存入缓存区BUFFER(内存中的一个区域),这个工作和EOM09类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时做了简化,即只解释了可显示字符(如英文小写字母、数字及一些字符),其他特殊键(如组合键、双态键、功能键等)都未做解释,只做字符码0来处理。
在主程序部分保存原有09类型的中断向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后开中断。
当键盘中段处理后,主程序安排指令读取缓存区中的字符并显示在屏幕上。
在主程序的末尾,利用DOS功能恢复原09类型的中断向量,然后返回DOS。
在显示键入的字符时,还应判断字符是否为回车符(0DH)。
如为回车符,说明一个句子输入完毕,此时调用显示时间的子程序显示打字时间,然后顺序显示一个例句。
如果所存放的例句都已显示完毕,则再次从第一个例句开始显示,直至键入某个功能(如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.2主模块框图
程序的核心模块是打字计时,通过显示的例句进行打字练习,最后显示出运行时间,主体流程图如下:
a.建立汇编原程序—通过———→b。
编译为目标文件—↓——→d.连接为可执行文件
↑↓
∣c.不通过,重新修改(语句错误)↓
∣———————————————————↓
↑f.不正确,用调式工具调式,重新修改(逻辑错误)↓
﹂———————————————————————e.运行
↓
正确g.完成
3详细设计
3.1主模块及子模块说明
主模块:
运行可执行程序显示打字主界面
缓冲区:
BUFFER,BUFPT1,BUFPT2
调用中断8259,键盘中断,时钟中断,设置打字计时文件输入所显示的例句、显示所用时间、回到主界面程序顺序。
3.2各模块详细设计
3.2.1主界面模块
主界面模块:
采用宏调用的方式将界面清屏并显示主界面和字母组成的乱序行界面。
程序运行后,我们首先要进行选择要继续进行即进入打字练习程序还是终止练习退出程序。
所以需要设置一个程序判断键盘键入的字符,规定E键和ENTER键分别为终止程序的控制键和进入打字练习程序的控制键,即当检验到键盘输入E后,退出程序;当键盘输入为ENTER时进入打字练习程序。
程序段中用到了中断INT21,利用中断的有关规定,先将01H存入到AH当中,则AL中即为由键盘键入的字符。
在此,先通过CMP指令来判断输入的字符是否是ENTER键(ENTER键的ASCII码为十六进制的0DH,程序开头部分的宏定义已经令CR为0DH),如果是的话,程序将跳转到程序speed3,speed3是定义的又一个程序,该程序即为打字练习程序的核心部分。
如果不是ENTER的话,将执行下一条指令,即判断键盘键入的是否为E键,此功能由CMP AL,45H来实现,其中45H是E键的ACSII码的十六进制的表示。
如果是E键的话,程序将跳转到exit子程序,再通过exit程序来判断是否要退出打字练习程序。
如果键盘键入的既不是ENTER也不是E键的话,程序将继续等待键盘的输入,直到输入的按键为ENTER和E当中的一个为止。
3.2.2中断处理模块
利用DOS提供的程序控制硬件。
优点是兼容性好,使用方便。
DOS是IBMPC系列微机的操作系统负责管理系统的所有资源,协调微机的操作,其中包括大量可供用户调用的服务程序。
DOS的功能调用不依赖于硬件系统。
所有的DOS系统功能调用都是利用软件中断指令INT21H来实现的。
也就是说在程序中需要调用DOS功能的时候,只要使用一条INT21H指令即可。
INT21H是一个具有90多个子功能的中断服务程序,这些子功能大致可以分为4类:
设备管理、目录管理、文件管理和其他。
为了方便用户使用这些子功能,INT21H对每一个子功能都进行了编号—称为功能号。
这样用户就能通过指定功能号来调用INT21H的不同子功能.
DOS系统功能调用的方法如下:
1.AH->功能号。
2.在其他的寄存器中放入该功能所要求的入口参数
3.在执行INT21H指令。
4.分析出口参数
用户自编中断处理程序基本形式
(1)将原中断向量保存在堆栈中或自设的存储单元中。
movah,35h
moval,int-type
int21h
movkeep-ip,bx
movkeep-cs,es
(2)设置自编处理程序的中断向量:
pushds
movdx,offsetroutine
movax,segroutine
movds,ax
moval,int-type
movah,25h
int21h
popds
(3)当中断程序结束时,必须恢复原来的中断向量,否则后续程序不能正确使用系统提供的例行程序。
pushds
movdx,keep-ip
movax,keep-cs
movds.ax
moval,int-type
movah,25h
int21h
popds
(4)编写中断处理子程序以完成中断处理功能,结束时由IRET返回中断点。
routineprocfar
pushax
sti
:
:
moval,20h
mov20h,al
popax
iret
routineendp
3.2.3打字计时模块
打字的计时部分就是定时器中断处理部分。
定时器的终端类型为08H,中断优先级比键盘高,只要在键盘中断处理程序KBINT中用一条STI指令允许高级中断,那么在整个键盘的输入过程中,定时器会以每秒18.2次的频率产生中断。
根据计时的需求,在整个键盘的输入过程中,必须把定时器中断的次数转换成时间,因此需要使用1CH中断扩充原定时期例行程序的功能。
在自编的1CH中断例行程序中,定时器中断的次数记录在计数单元count中,当count计数值为18时,sec计数单元加1,当sec计数值达到60时,main计数单元加1.当然,输入一个句子无论如何也不会达到小时计,所以对hours计数值的调整判断,实际上只起到推出定时器中断的作用。
当打完一个例句后按Enter键显示打字练习时间:
calldisptime
leadx,crlf
movah,09h
int21h
addsi,2
cmpsi,5*2
jnenext
jmpfirst
endint:
cli
pushds
movdx,save_lc
movax,save_lc+2
movds,ax
moval,1ch
movah,25h
int21h
popds
pushds
movdx,oldip9
movax,oldcs9
movds,ax
moval,09h
movah,25h
int21h
popds
sti
ret
mainendp
clintprocnear
pushds
movbx,data
movds,bx
leabx,count
incwordptr[bx]
cmpwordptr[bx],18
jnereturn
callinct
adj:
cmphours,12
jlereturn
subhours,12
return:
popds
sti
iret
clintendp
inctprocnear
movwordptr[bx],0
addbx,2
incwordptr[bx]
cmpwordptr[bx],60
jneexit
callinct
exit:
ret
inctendp
disptimeprocnear
movax,min
callbindec
movbx,0
moval,':
'
movah,0eh
int10h
movax,sec
callbindec
movbx,0
moval,':
'
movah,0eh
int10h
movbx,count
moval,55d
mulbl
callbindec
ret
disptimeendp
bindecprocnear
movcx,100d
calldecdiv
movcx,10d
calldecdiv
movcx,1
calldecdiv
ret
bindecendp
decdivprocnear
movdx,0
divcx
movbx,0
addal,30h
movah,0e