打字计时新3333Word文件下载.docx
《打字计时新3333Word文件下载.docx》由会员分享,可在线阅读,更多相关《打字计时新3333Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
2.课程设计报告书
内容摘要
汇编语言是微机原理和接口设计的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。
尽管汇编语言设计程序有编程效率低的缺点,但其运行效率高,速度快,并且特别适合很多特殊应用的场合,如加密解密、病毒分析和防治、软件破解等。
这些在应用方面的优点是其他语言不可比拟的,面对硬件的直接控制更是其特长。
因此,在很多高级语言(如C++)中都可嵌入用汇编语言编写的程序段,以实现优势互补,发挥各自的长处。
本程序是一个在键盘上练习打字并能统计时间的程序,在缓冲区中预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间。
通过它练习英文打字练习,并能够统计时间。
程序运行时,使用自编的中断向量处理程序。
程序退出时,恢复中断向量。
目录
一、概述………………………………………………………………4
二、方案设计与论证……………………………………………………………4
1.实验目的…………………………………………………………………4
2.实验步骤…………………………………………………………………4
四、设计方案……………………………………………………………………6
1.定义数据段,设置主要参数……………………………………………
2.代码段…………………………………………………………………
3.使用子程序分化各子功能……………………………………………
五、程序代码……………………………………………………………………12
六、实验结果及分析……………………………………………………………17
七、心得体会……………………………………………………………………18
八、参考文献……………………………………………………………………18
一、概述
汇编语言是微型计算机原理及应用的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。
尽管汇编语言程序设计编程效率低,但其运行效率高、速度快。
因此掌握汇编语言是学好微机原理和接口设计的第一步。
打字计时程序主要是中断的使用,难点在于键盘中断的重新写入以及自编的定时中断。
二、方案设计与论证
1、实验目的:
熟悉和掌握有关键盘和时间的中断及字符显示技术。
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×
55ms
2)设计流程图,如下图所示
三、设计方案
1.定义数据段,设置主要参数:
缓冲区:
BUFFER,BUFPT1,BUFPT2
2.代码段
调用中断8259,键盘中断,时钟中断,设置打字计时文件程序顺序
3.使用子程序分化各子功能
DISPTIMEPROCNEAR
BINDECPROCNEAR;
将二进制转化为十进制显示时间
DECDIVPROCNEAR;
转化成字符显示
DISPCHARPROCNEAR
KBGETPROCNEAR;
获取键盘键入的信息
KBINTPROCNEAR;
查表查到相应的字符
RESET09PROC;
重新设置09号中断
RESET1CPROC;
重新设置1c功能
RESETPROC;
回复1C与09
四、程序代码
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.'
OLDCS9DW?
9号中断向量地址
OLDIP9DW?
9号中断向量首地址
STR1DB'
WANGLAOSHININHAO.'
DB0DH,0AH,'
STR2DB'
WANGLAOSHIXINKULE.'
STR3DB'
WANGLAOSHIWOMENAINI.'
STR4DB'
WANGLAOSHINIYONGYUANZAIWOMENXINZHONG.'
STR5DB'
WANGLAOSHIZAIJIAN.'
CRLFDB0DH,0AH,'
COLONDB'
:
'
EVEN
SADDRDWSTR1,STR2,STR3,STR4,STR5
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,35H
MOVAL,09H
INT21H
MOVOLDCS9,ES
MOVOLDIP9,BX
******设置自编处理程序的中断向量******
PUSHDS
MOVDX,SEGKBINT
MOVDS,DX
MOVDX,OFFSETKBINT
MOVAH,25H
POPDS
;
******将原中断向量1CH保存在自设的单元中******
MOVAL,1CH
MOVSAVE_LC,BX
MOVSAVE_LC+2,ES
******设置自编处理程序的中断向量******
MOVDX,SEGCLINT
MOVDX,OFFSETCLINT
POPDS
******允许键盘和定时器中断******
INAL,21H
ANDAL,11111100B
OUT21H,AL
******显示提示信息******
FIRST:
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
******显示例句结束否?
******
ADDSI,2
CMPSI,5*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:
INCTENDP
******显示打字练习时间******
DISPTIMEPROCNEAR;
显示时间主段
MOVAX,MIN;
分移动到AX寄存器
CALLBINDEC;
显示数字
MOVBX,0
MOVAL,'
MOVAH,0EH;
显示冒号
INT10H
MOVAX,SEC;
秒移动到AX
CALLBINDEC
MOVAH,0EH
MOVBX,COUNT
MOVAL,55D;
百分秒
MULBL
DISPTIMEENDP
******将二进转化为十进显示时间******
BINDECPROCNEAR
MOVCX,100D;
显示百位
CALLDECDIV
MOVCX,10D;
显示十位
MOVCX,1;
显示个位
BINDECENDP
YS1PROCNEAR
MOVcx,0ffffH
DLY1:
deccx
cmpcx,0
JNZDLY1
DECDIVPROCNEAR;
MOVDX,0
DIVCX
ADDAL,30H;
转换成ASCII
INT10H;
显示一个字符
MOVAX,DX
DECDIVENDP
******获取键盘键入的信息******
KBGETPROCNEAR
PUSHBX
MOVBX,BUFPT1;
标志缓冲区的大小
CMPBX,BUFPT2
JNZKBGET2
CMPKBFLAG,0;
!
=00H的时候,一直获取键盘
JNZKBGET3
POPBX
JMPKBGET
KBGET2:
MOVAL,[BUFFER+BX]
INCBX
CMPBX,16H
JCKBGET3
KBGET3:
MOVBUFPT1,BX
RET
******键盘中断处理程序******
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;
显示字符
MOVAH,0EH;
显示一个字符在AL里
显示一个字条符
DISPCHARENDP
CODEENDS
ENDSTAR
五、实验结果及分析
六、实验总结
课程设计对我们多数初学汇编的学生来说,确实是个一座高峰。
翻越它是要付出诸多努力的。
我们也是摸索了好久才弄明白它的。
在此做个小结,也许对自己今后的学习有一些借鉴的作用。
为了避免寄存器冲突的问题,在设计子程序时,应把所有用到的寄存器都入栈保存,但用来传递参数和结果的寄存器则要注意,不必入栈的就不入栈了,以免得不到预期的结果。
可以把寄存器当作变量来看待,有时候它存储的是数据变量(如把BP当作字符个数的记录器),而有时候它存储的是地址变量(如DI、SI);
内存中的数据,按它们的结构关系,则可以把它们看待成数组,我们对数组,可以通过首地址来访问它们。
传递参数和结果的,一般可以用寄存器,也可以用一段内存空间来传递,特别是需要传递的数据较多的时候。
在设计子程序时,往往涉及到许多的循环,这时候就要注意把不该循环的变量要放在循环体外。
一周的汇编语言课程设计结束了,我的收获是很大的。
通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足。
通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握了各个指令的功能,特别是转向指令,掌握了子程序的定义及调用,以及正确地运用DEBUG指令。
在整个程序的编写中,调试占了很大部分的时间。
要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。
通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平另外,我觉得,学习汇编有一个比较大的好处,就是可以了解到在电脑中每一个字节数据的来龙去脉,我觉得学习汇编可以发挥一下自己的空间想像力,特别是对内存中数据的组织、存储关系的想像。
当然,学习汇编还有另一个重要的收获,就是如何处理数据的问题。
七、参考文献
[1]张荣标等编著.《微型计算机原理与接口技术》北京:
机械工业出版社
[2]宋杰汪志宏江敏编.《微型计算机与接口技术课程设计》.北京:
教师评语及设计成绩
评语
课程设计成绩:
指导教师:
日期:
年月日