汇编设计报告打字计时练习程序.docx
- 文档编号:749391
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:22
- 大小:65.29KB
汇编设计报告打字计时练习程序.docx
《汇编设计报告打字计时练习程序.docx》由会员分享,可在线阅读,更多相关《汇编设计报告打字计时练习程序.docx(22页珍藏版)》请在冰点文库上搜索。
汇编设计报告打字计时练习程序
汇编语言课程设计报告
(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,0eh
int10h
movax,dx
ret
decdivendp
4程序调试
4.1运行界面分析
通过设计和编写程序代码,运行程序后其结果为先显示开始界面即为菜单界面,而后进入打字训练界面,打完字敲击回车键就马上进入下一行语句的训练,其具体的调试结果如下所示:
进入运行界面:
(开始的菜单界面)
运行cmd找到C:
\TASM50\TASM50\TASM50\BIN中的程序,并通过tasm和tlink来确认程序正确,无运行错误,具体见上图。
敲击回车键进入打字练习界面:
4.2调试过程及分析
程序在运行之后提示语不在一行,检查程序发现控制提示语位置的DL,DH有问题,将一开始的subdl,19改为adddl,02H,此时再次运行之后可以看到提示语在适当的位置,满足要求。
一开始写程序时,代码写得特别多,当程序主体完成后,便对程序做了优化,主要是对代码量的缩减,主要缩减了一段为随机字母分配空间的代码,一开始在定义的时候别给内存空间赋值为0,而后又在功能段的时候对该内存空间赋0值,这样一来便重复了,所以后来就把功能段的那段代码去掉了,代码量一下少了许多。
5心得体会
5.1设计体会
汇编语言程序设计的方法和多模块程序设计。
作为最基本的编程语言之一,汇编语言的重要性勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。
尤其在和硬件关系非常密切的程序或要提高运算速度的程序,即使是C语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。
这次课程设计历时一个星期,其中学到很多很多的的东西,巩固了一学期所学到的的知识,而且学到了很多在书本上所没有学到过的知识。
以前在上课的时候,总是心不在焉,只是大概听听。
但是,这次课程设计完全改变了我以前的那种错误的认识,学习更加注重细节问题。
其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。
通过这次课程设计发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
在设计中也遇到了很多编程问题,但最后经过自己的努力和大家的帮助完成了这次课程设计。
这让我明白了只要有恒心,有耐心,就可以达到自己的目标,完成任务!
最后,感谢帮助我完成课程设计的的老师和同学!
5.2系统改进
对于这个打字系统,其满足了题目的所有要求,所有功能都可以实现。
但我觉得这个打字练习还有许多地方可以改进,首先是界面,界面还可以设置的更友好,现在的界面看上去不是那么的友好,只满足了基本功能,让用户知道如何使用这个系统。
改进可以让用户感觉眼前一亮这种效果最好,当然这需要花费更多的时间和精力。
再一个可以改进的地方便是系统的功能了,该打子系统的功能比较少,对于打字练习来说,其目的在于提高使用者的打字速度,所以程序最好加一个计时功能模块,这样用户就可以知道使用后自己的打字速度有没有得到提升。
还有就是当用户打字出错的时候,最好在给用户配备一个警告功能以及统计错误功能,这样可以提醒用户,让用户知道打字出错了。
当然还有其他许多地方值得我进一步去探讨,去完善这个程序。
参考文献
[1]王爽.汇编语言.北京:
清华大学出版
[2]温冬蝉,沈美明.IBM PC汇编语言程序设计.第2版.北京:
清华大学出版社,2002.3
[3]齐志儒,高福祥主编.汇编语言程序设计.第2版.东北大学出版社,2001.1
[4]李敬兆.8086/8088和基于ARM核汇编语言程序设计.第二版.合肥:
中国科学技术大学出版社,2008.9
附录
附录1源程序清单
附录1.1打字计时练习模块源程序
stacksegmentparastack'stack'
db256dup(0)
toplabelword
stackends
datasegmentparapublic'data'
bufferdb16hdup(0)
bufpt1dw0
bufpt2dw0
kbflagdb0
promptdb'*pleasepractisetyping*',0dh,0ah,'$'
scantabdb0,0,'1234567890-=',8,0
db'qwertyuiop[]',0dh,0
db'asdfghjkl;',0,0,0,0
db'zxcvbnm,./',0,0,0
db'',0,0,0,0,0,0,0,0,0,0,0,0,0
db'789-456+1230.'
even
oldcs9dw?
oldip9dw?
str1db'ifyousmilewhennooneisaround,youreallymeanit.'
db0dh,0ah,'$'
str2db'therearesomenewspapersonthetable.'
db0dh,0ah,'$'
str3db'therearesomecloudsinthesky.'
db0dh,0ah,'$'
str4db'shealwayseatsherlunchatnoon.'
db0dh,0ah,'$'
str5db'idonotlikeautumnandwinter.'
crlfdb0dh,0ah,'$'
colondb':
','$'
even
saddrdwstr1,str2,str3,str4,str5
countdw0
secdw0
mindw0
hoursdw0
save_lcdw2dup(?
)
dataends
codesegment
assumecs:
code,ds:
data,es:
data,ss:
stack
mainprocfar
start:
movax,stack
movss,ax
movsp,offsettop
pushds
subax,ax
pushax
movax,data
movds,ax
moves,ax
;movah,0
;moval,4
;int21h
;movah,0bh
;movbh,0
;movbl,4
;int11h
movah,35h
moval,09h
int21h
movoldcs9,es
movoldip9,bx
pushds
movdx,segkbint
movds,dx
movdx,offsetkbint
moval,09h
movah,25h
int21h
popds
movah,35h
moval,1ch
int21h
movsave_lc,bx
movsave_lc+2,es
pushds
movdx,segclint
movds,dx
movdx,offsetclint
moval,1ch
movah,25h
int21h
popds
inal,21h
andal,11111100b
out21h,al
first:
movah,0
moval,3
int10h
movdx,offsetprompt
movah,9
int21h
movsi,0
next:
movdx,saddr[si]
movah,09h
int21h
movcount,0
movsec,0
movmin,0
movhours,0
sti
forever:
callkbget
testkbflag,80h
jnzendint
pushax
calldispchar
popax
cmpal,0dh
jnzforever
moval,0ah
calldispchar
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,0eh
int10h
movax,dx
ret
decdivendp
kbgetprocnear
pushbx
cli
movbx,bufpt1
cmpbx,bufpt2
jnzkbget2
cmpkbflag,0
jnzkbget3
sti
popbx
jmpkbget
kbget2:
moval,[buffer+bx]
incbx
cmpbx,16h
jckbget3
movbx,0
kbget3:
movbufpt1,bx
popbx
ret
kb
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 设计 报告 打字 计时 练习 程序