您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 汇编语言课程设计打字练习程序
汇编语言设计报告课题:打字计时练习程序专业计算机科学与技术(网络工程)学生姓名张飞龙班级B计算机092学号0910704226指导教师王志宏完成日期2011年6月22日打字计时练习程序设计1.问题提出及功能要求设计一个在键盘上练习打字并能统计时间的程序。通过它练习英文打字练习,并能够统计时间。要求:在缓冲区中预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,,每输入完一行后按回车键,可显示出练习输入的时间和下一行例句。按Esc键可退出程序。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。因为输入完一个句子无论如何也不会达到小时级,所以对hours计数值的调整判断,实际上只起到退出定时器中断的作用。显示时间的子程序disptime分别将各遍野单元的二进制数转换为十进制数,并以min:sec:msec的形式显示出来。其中msec是由count记数值转换成的:count×1秒/18.2=count×55ms2.2程序流程图保存原中断09H到自设的单元中设置自编处理程序的中断向量09H保存原中断向量1CH到自设的单元中设置自编处理程序的中断向量1CH设置允许键盘和定时器中断设置显示方式为80×25显示提示信息在屏幕上显示例句初始化变量count、sec、min、hours开中断CallkbgetKbflag=80h?(键盘输入的是控制键或功能键吗)开始Calldispchar显示该字符CalldispcharCalldisptime显示回车换行符检测并等待键盘中断的子程序显示打字时间显示回车换行符字符5个例句都练习完了吗?恢复原中断向量1CH、09H,返回操作系统Y输入的字符为回车符0DH?AL←换行符(0AH)NNNY3.代码设计3.1功能模块说明3.1.1定义数据段,设置主要参数:缓冲区:BUFFER,BUFPT1,BUFPT23.1.2代码段调用中断8259,键盘中断,时钟中断,设置打字计时文件程序顺序3.1.3使用子程序分化各子功能DISPTIMEPROCNEARBINDECPROCNEAR;将二进制转化为十进制显示时间DECDIVPROCNEAR;转化成字符显示DISPCHARPROCNEARKBGETPROCNEAR;获取键盘键入的信息KBINTPROCNEAR;查表查到相应的字符RESET09PROC;重新设置09号中断RESET1CPROC;重新设置1c功能RESETPROC;回复1C与093.2源程序STACKSEGMENTPARASTACK'STACK'DB256DUP(0)TOPLABELWORDSTACKENDSDATASEGMENTPARAPUBLIC'DATA'BUFFERDB16HDUP(0);缓冲区大小BUFPT1DW0;缓冲区1BUFPT2DW0;缓冲区2KBFLAGDB0;参数,80H表示允许,00表示不允许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,0DB'789-456+1230.'******设置一些存储地址便于理解******EVENOLDCS9DW?;9号中断向量地址OLDIP9DW?;9号中断向量首地址******预设置打字练习的句子******STR1DB'ABCDEFGHIJKLMNOPQRSTUVWXYZ.';句子1DB0DH,0AH,'$'STR2DB'THEREARESOMENEWSPAPERSONTHETABLE.'DB0DH,0AH,'$'STR3DB'THEREARESOMECLOUDSINTHESKY.'DB0DH,0AH,'$'STR4DB'SHEALWAYSEATSHERLUNCHATNOON.'DB0DH,0AH,'$'STR5DB'IDONOTLIKEAUTUMNANDWINTER.'CRLFDB0DH,0AH,'$'COLONDB':','$'EVENSADDRDWSTR1,STR2,STR3,STR4,STR5******定义时间参数******COUNTDW0;记时器记数SECDW0;秒MINDW0;分HOURSDW0;小时SAVE_LCDW2DUP(?);1C向量地址DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKMAINPROCFARSTART:MOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPPUSHDS;现场保护SUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AX;*******将原中断向量09H保存在自设的单元中******MOVAH,0MOVAL,4INT21HMOVAH,0BHMOVBH,0MOVBL,4INT11HMOVAH,35H;取中断向量的功能调用MOVAL,09HINT21HMOVOLDCS9,ESMOVOLDIP9,BX;******设置自编处理程序的中断向量******PUSHDSMOVDX,SEGKBINT;自编中断类型程序段地址放入DSMOVDS,DXMOVDX,OFFSETKBINT;自编中断类型程序偏移地址放入DXMOVAL,09HMOVAH,25H;设置中断向量功能调用INT21HPOPDS;******将原中断向量1CH保存在自设的单元中******MOVAH,35HMOVAL,1CHINT21HMOVSAVE_LC,BXMOVSAVE_LC+2,ES;******设置自编处理程序的中断向量******PUSHDSMOVDX,SEGCLINTMOVDS,DXMOVDX,OFFSETCLINTMOVAL,1CHMOVAH,25HINT21HPOPDS;******允许键盘和定时器中断******INAL,21H;允许键盘和定时器中断ANDAL,11111100BOUT21H,AL;******设置显示方式******FIRST:MOVAH,0MOVAL,3INT10H;******显示提示信息******MOVDX,OFFSETPROMPT;显示提示信息MOVAH,9INT21H;******在屏幕上显示例句******MOVSI,0NEXT:MOVDX,SADDR[SI];显示例句MOVAH,09HINT21H;******初始化变量******MOVCOUNT,0;设置初值MOVSEC,0MOVMIN,0MOVHOURS,0;******允许更高一级的中断******STIFOREVER:CALLKBGETTESTKBFLAG,80HJNZENDINTPUSHAXCALLDISPCHARPOPAXCMPAL,0DHJNZFOREVERMOVAL,0AHCALLDISPCHAR;******显示时间******CALLDISPTIMELEADX,CRLFMOVAH,09HINT21H;******显示例句结束否?******ADDSI,2CMPSI,5*2JNENEXTJMPFIRST;******原来的中断向量******ENDINT:CLIPUSHDSMOVDX,SAVE_LCMOVAX,SAVE_LC+2MOVDS,AXMOVAL,1CH;恢复中断向量1CHMOVAH,25HINT21HPOPDSPUSHDSMOVDX,OLDIP9MOVAX,OLDCS9MOVDS,AXMOVAL,09HMOVAH,25HINT21HPOPDSSTIRETMAINENDP;******定时器中断处理程序******CLINTPROCNEARPUSHDSMOVBX,DATAMOVDS,BXLEABX,COUNTINCWORDPTR[BX]CMPWORDPTR[BX],18;初始化记数JNERETURNCALLINCTADJ:CMPHOURS,12;是否满12小时JLERETURNSUBHOURS,12;满足减去12RETURN:POPDSSTIIRETCLINTENDPINCTPROCNEARMOVWORDPTR[BX],0ADDBX,2INCWORDPTR[BX];BX内容自增1CMPWORDPTR[BX],60;和60比较JNEEXITCALLINCTEXIT:RETINCTENDP;******显示打字练习时间******DISPTIMEPROCNEAR;显示时间主段MOVAX,MIN;分移动到AX寄存器CALLBINDEC;显示数字MOVBX,0MOVAL,':'MOVAH,0EH;显示冒号INT10HMOVAX,SEC;秒移动到AXCALLBINDECMOVBX,0MOVAL,':'MOVAH,0EHINT10HMOVBX,COUNTMOVAL,55D;百分秒MULBLCALLBINDECRETDISPTIMEENDP******将二进转化为十进显示时间******BINDECPROCNEARMOVCX,100D;显示百位CALLDECDIVMOVCX,10D;显示十位CALLDECDIVMOVCX,1;显示个位CALLDECDIVRETBINDECENDPDECDIVPROCNEAR;转化成字符显示MOVDX,0DIVCXMOVBX,0ADDAL,30H;转换成ASCIIMOVAH,0EHINT10H;显示一个字符MOVAX,DXRETDECDIVENDP******获取键盘键入的信息******KBGETPROCNEARPUSHBXCLIMOVBX,BUFPT1;标志缓冲区的大小CMPBX,BUFPT2JNZKBGET2CMPKBFLAG,0;!=00H的时候,一直获取键盘JNZKBGET3STIPOPBXJMPKBGETKBGET2:MOVAL,[BUFFER+BX]INCBXCMPBX,16HJCKBGET3MOVBX,0KBGET3:MOVBUFPT1,BXPOPBXRETKBGETENDP;******键盘中断处理程序******KBINTPROCNEARPUSHBXPUSHAXINAL,60H;键盘输入寄存器端口地址PUSHAXINAL,61H;控制商品寄存器地址ORAL,80HOUT61H,AL;读数据ANDAL,7FH;第八位清0,ASCII只有7位OUT61H,ALPOPAXTESTAL,80HJNZKBINT2MOVBX,OFFSETSCANTAB;查表输出字符XLATSCANTA
本文标题:汇编语言课程设计打字练习程序
链接地址:https://www.777doc.com/doc-4411666 .html