微原课设打字计时练习程序Word文件下载.docx
- 文档编号:16239269
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:18
- 大小:244.04KB
微原课设打字计时练习程序Word文件下载.docx
《微原课设打字计时练习程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《微原课设打字计时练习程序Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
王长坤
摘要
在PC系统中,驻留的ROM中有8KB的BIOS。
它实现对系统中种种常用设备的输入输出操作的管理。
其中的16H中断调用即为键盘输入输出中断调用,实现从键盘输入字符到AL寄存器、读键盘缓冲区字符到AL寄存器、读取特殊功能键的状态等功能。
本程序是一个在键盘上练习打字并能统计时间的程序,在缓冲区中预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,输入完一段按回车键后,可显示出练习输入的时间。
通过它练习英文文章打字练习,并能够统计时间。
程序运行时,使用自编的中断向量处理程序。
程序退出时,恢复中断向量。
目录
第一章课程设计题目描述和要求1
1.1问题提出及功能要求1
1.2运行环境1
1.3本课题涉及的知识点1
第二章算法设计2
2.1设计思路2
2.2程序流程图3
第三章代码设计5
3.1功能模块说明5
3.2源程序5
第四章调试与运行13
4.1实验步骤13
4.2运行程序14
4.3调试中出现的问题15
第五章总结16
参考文献16
正文:
1、课程设计题目描述和要求
1.1问题提出及功能要求
1.2运行环境
Windows7操作系统、文本编辑器使用EDIT或NOTEPAD,汇编程序使用MASM.EXE,连接程序使用LINK.EXE,调试程序使用DEBUG.EXE。
1.3本课题涉及的知识点
定义数据段,设置主要参数:
设置9号中断向量地址,9号中断向量首址,1C向量地址;
定义时间参数为秒、分、小时。
在代码段,调用中断8259、键盘中断、时钟中断、并设置打字计时文件程序顺序。
整个程序使用序分化各子功能。
2、算法设计
2.1设计思路
在键盘上练习的打字英文文章及其地址表、计时单元等预先放在DATA数据段中,自编的中断程序kbint检测按键时产生的中断,并把按键的扫描码转换为ASCII码存入缓存区buffer,这个工作和ROM09类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时作了简化,即只解释了可显示字符,如英文字母、数字及一些符号;
其他特殊键,如组合键、双态键、功能键等都未作解释,只作为字符码0来处理。
在主程序部分保存原09类型的中断向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后开中断。
当键盘中断处理后,主程序中安排指令读取缓冲区中的字符并显示在屏幕上。
在主程序的末尾,利用DOS功能恢复原09类型的中断向量,然后返回DOS。
在显示键入的字符时,还应判断字符是否为回车(0DH)。
如为回车符,说明本文输入完毕,此时调用显示时间的子程序显示出打字时间。
如果所存放的例当键入某一功能键(如Esc键、Shift键等)退出程序,结束打字练习。
打字时间统计利用自定时器中断处理程序clint来完成。
在此中断例行程序中,定时器中断的次数记录在计数单元count中,当count计数值为18时,sec计数单元加1,当sec计数值达到60时,min计数单元加1。
显示时间的子程序disptime分别将各遍野单元的二进制数转换为十进制数,并以min:
sec:
msec的形式显示出来。
其中msec是由count记数值转换成的:
count×
1秒/18.2=count×
55ms
3、代码设计
3.1功能模块说明
3.1.1定义数据段,设置主要参数:
缓冲区:
BUFFER,BUFPT1,BUFPT2
3.1.2代码段
调用中断8259,键盘中断,时钟中断,设置打字计时文件程序顺序
3.1.3使用子程序分化各子功能
DISPTIMEPROCNEAR
BINDECPROCNEAR;
将二进制转化为十进制显示时间
DECDIVPROCNEAR;
转化成字符显示
DISPCHARPROCNEAR
KBGETPROCNEAR;
获取键盘键入的信息
KBINTPROCNEAR;
查表查到相应的字符
RESET09PROC;
重新设置09号中断
RESET1CPROC;
重新设置1c功能
RESETPROC;
回复1C与09
3.2源程序
STACKSEGMENTPARASTACK'
STACK'
DB256DUP(0)
TOPLABELWORD
STACKENDS
DATASEGMENTPARAPUBLIC'
DATA'
BUFFERDB16HDUP(0);
缓冲区大小
BUFPT1DW0;
缓冲区1
BUFPT2DW0;
缓冲区2
KBFLAGDB0;
参数,80H表示允许,00表示不允许
PROMPTDB'
*PLEASEPRACTISETYPING*'
0DH,0AH,'
$'
;
定义提示语句
SCANTABDB0,0,'
1234567890-='
8,0;
定义键盘
DB'
QWERTYUIOP[]'
0DH,0;
定义键盘第一行英文字母及符号
ASDFGHJKL;
'
0,0,0,0;
键盘第二行英文字母及符号
ZXCVBNM,./'
0,0,0;
键盘第三行英文字母及符号
'
0,0,0,0,0,0,0,0,0,0,0,0,0
789-456+1230.'
******设置一些存储地址便于理解******
EVEN
OLDCS9DW?
9号中断向量地址
OLDIP9DW?
9号中断向量首地址
******预设置打字练习的句子******
STR1DB'
WOMENLAIZI090443BAN,WOMENXIAOZUYOUWUGEREN,FENBIESHICHENDIAN,ZHANGPENGLEI,YANGZHENHUA,CHENYABO,DANHUABING.'
句子1
DB0DH,0AH,'
CRLFDB0DH,0AH,'
COLONDB'
:
'
SADDRDWSTR1
******定义时间参数******
COUNTDW0;
记时器记数
SECDW0;
秒
MINDW0;
分
HOURSDW0;
小时
SAVE_LCDW2DUP(?
);
1C向量地址
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
;
*******将原中断向量09H保存在自设的单元中******
MOVAH,0
MOVAL,4
INT21H
MOVAH,0BH
MOVBH,0
MOVBL,4
INT11H
MOVAH,35H;
取中断向量的功能调用
MOVAL,09H
MOVOLDCS9,ES
MOVOLDIP9,BX
******设置自编处理程序的中断向量******
PUSHDS
MOVDX,SEGKBINT;
自编中断类型程序段地址放入DS
MOVDS,DX
MOVDX,OFFSETKBINT;
自编中断类型程序偏移地址放入DX
MOVAH,25H;
设置中断向量功能调用
POPDS
******将原中断向量1CH保存在自设的单元中******
MOVAH,35H
MOVAL,1CH
MOVSAVE_LC,BX
MOVSAVE_LC+2,ES
******设置自编处理程序的中断向量******
MOVDX,SEGCLINT
MOVDS,DX
MOVDX,OFFSETCLINT
MOVAH,25H
******允许键盘和定时器中断******
INAL,21H;
允许键盘和定时器中断
ANDAL,11111100B
OUT21H,AL
******设置显示方式******
FIRST:
MOVAH,0
MOVAL,3
INT10H
******显示提示信息******
MOVDX,OFFSETPROMPT;
显示提示信息
MOVAH,9
******在屏幕上显示例句******
MOVSI,0
NEXT:
MOVDX,SADDR[SI];
显示例句
MOVAH,09H
******初始化变量******
MOVCOUNT,0;
设置初值
MOVSEC,0
MOVMIN,0
MOVHOURS,0
******允许更高一级的中断******
STI
FOREVER:
CALLKBGET
TESTKBFLAG,80H
JNZENDINT
CALLDISPCHAR
POPAX
CMPAL,0DH
JNZFOREVER
MOVAL,0AH
******显示时间******
CALLDISPTIME
LEADX,CRLF
MOVAH,09H
******显示例句结束否?
******
ADDSI,2
CMPSI,2*2
JNENEXT
JMPFIRST
******原来的中断向量******
ENDINT:
CLI
MOVDX,SAVE_LC
MOVAX,SAVE_LC+2
MOVAL,1CH;
恢复中断向量1CH
MOVDX,OLDIP9
MOVAX,OLDCS9
RET
MAINENDP
******定时器中断处理程序******
CLINTPROCNEAR
MOVBX,DATA
MOVDS,BX
LEABX,COUNT
INCWORDPTR[BX]
CMPWORDPTR[BX],18;
初始化记数
JNERETURN
CALLINCT
ADJ:
CMPHOURS,12;
是否满12小时
JLERETURN
SUBHOURS,12;
满足减去12
RETURN:
IRET
CLINTENDP
INCTPROCNEAR
MOVWORDPTR[BX],0
ADDBX,2
INCWORDPTR[BX];
BX内容自增1
CMPWORDPTR[BX],60;
和60比较
JNEEXIT
EXIT:
RET
INCTENDP
******显示打字练习时间******
DISPTIMEPROCNEAR;
显示时间主段
MOVAX,MIN;
分移动到AX寄存器
CALLBINDEC;
显示数字
MOVBX,0
MOVAL,'
MOVAH,0EH;
显示冒号
MOVAX,SEC;
秒移动到AX
CALLBINDEC
MOVAH,0EH
MOVBX,COUNT
MOVAL,55D;
百分秒
MULBL
DISPTIMEENDP
******将二进转化为十进显示时间******
BINDECPROCNEAR
MOVCX,100D;
显示百位
CALLDECDIV
MOVCX,10D;
显示十位
CALLDECDIV
MOVCX,1;
显示个位
BINDECENDP
DECDIVPROCNEAR;
MOVDX,0
DIVCX
ADDAL,30H;
转换成ASCII
INT10H;
显示一个字符
MOVAX,DX
DECDIVENDP
******获取键盘键入的信息******
KBGETPROCNEAR
PUSHBX
CLI
MOVBX,BUFPT1;
标志缓冲区的大小
CMPBX,BUFPT2
JNZKBGET2
CMPKBFLAG,0;
!
=00H的时候,一直获取键盘
JNZKBGET3
POPBX
JMPKBGET
KBGET2:
MOVAL,[BUFFER+BX]
INCBX
CMPBX,16H
JCKBGET3
KBGET3:
MOVBUFPT1,BX
KBGETENDP
******键盘中断处理程序******
KBINTPROCNEAR
INAL,60H;
键盘输入寄存器端口地址
INAL,61H;
控制商品寄存器地址
ORAL,80H
OUT61H,AL;
读数据
ANDAL,7FH;
第八位清0,ASCII只有7位
OUT61H,AL
TESTAL,80H
JNZKBINT2
MOVBX,OFFSETSCANTAB;
查表输出字符
XLATSCANTAB;
查表
CMPAL,0
JNZKBINT4
MOVKBFLAG,80H
JMPKBINT2
KBINT4:
MOVBX,BUFPT2
MOV[BUFFER+BX],AL
JCKBINT3
KBINT3:
CMPBX,BUFPT1
JZKBINT2
MOVBUFPT2,BX
KBINT2:
MOVAL,20H
OUT20H,AL;
送825920H端口
KBINTENDP
DISPCHARPROCNEAR;
显示字符
显示一个字符在AL里
显示一个字条符
DISPCHARENDP
CODEENDS
ENDSTART
4、调试与运行
4.1实验步骤:
1)打开windows命令窗口
2)进入masm程序的安装目录,汇编源文件,如图:
图4.1.2汇编程序
3)连接程序,并查看生成可执行文件000.exe。
4)关闭对话框,打开可执行文件000.exe,开始打字计时练习。
4.2运行程序:
1)设置主程序段显示提示信息,程序功能应该实现下图所示:
图4.2.1程序调试
2)调用DISPCHARPROCNEAR显示用户字条,调用DISPTIMEPROCNEAR显示时间,程序应该实现下图所示:
图4.2.2程序调试
3)输入完后回车显示时间,再回车跳转到开始重新开始练习。
4.3调试中出现的问题
没有注意到要操作的目标数据(内存中的数据)的大小和使用的操作容器(寄存器)的大小没有一致。
另外,对于处理数据的ds:
[bx]方式,如movds:
[bx],dxaddbx,2在循环中应注意bx的递增或递减大小,如果处理字节,比如用dl,循环中就加或减1;
如果处理字,比如用dx,就加或减2。
在以后应该留意这个一致性。
在8086上,ss和sp都是16位的,栈所处理的最小单位也是16位的,即最小是一个字,栈一次读和一次写,都至少是一个字那么大。
5、总结
这个汇编课程设计是我大学以来做的第一个课设,而对我们很多初学汇编的学生来说,要编写一个类似于打字练习的程序的软件确实是个一座高峰。
要实现它确实是要付出诸多努力的。
我们也是摸索了好久才弄明白它的。
现在对做这个课设做一个总结,为了下一次做其他课设不犯类似的错误。
从一开始很多东西都不懂,要把一整本书里面的相关附录查清楚,同时还要去图书馆查阅相关资料!
也要去网上寻找资料。
开始做课设的时候我们分工合作,把每个人分给的工作即查找资料给找到,然后再把资料统一整合。
开始编辑源代码!
编辑完了之后一运行,存在着很多的错误,我们要一个一个的重新修改,重新查找资料!
在调试的时候也遇到了一些的问题。
不过通过大家一起合力很快就得到了正确的调试好的程序!
通过过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平,另外,我觉得,学习汇编有一个比较大的好处,就是可以了解到在电脑中每一个字节数据的来龙去脉,我觉得学习汇编可以发挥一下自己的空间想像力,特别是对内存中数据的组织、存储关系的想像。
今后在工作中就同样有可能用到汇编这里面的知识,经过这次课程设计,我觉得在今后碰到这类问题的时候不会再觉得棘手了!
参考文献
1、郑初华、胡景春《汇编语言、微机原理及接口技术》。
电子工业出版社2010
2、罗云彬《Windows环境下32位汇编语言程序设计》电子工业出版社,2002。
3、吴向军《汇编语言程序设计》高等教育出版社,2002
4、赵润林、范国渠《汇编语言程序设计教程与实训》北京大学出版社2006
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微原课设 打字 计时 练习 程序