汇编语言课程设计打字练习程序_第1页
汇编语言课程设计打字练习程序_第2页
汇编语言课程设计打字练习程序_第3页
汇编语言课程设计打字练习程序_第4页
汇编语言课程设计打字练习程序_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语逾域工曙院言设计

报告

课题:打字计时练习程序

专业计算机科学与技术(网络工程)

学生姓名_______________________

班级___________B计算机092__________

学号____________________

指导教师_______________________

完成日期2011年6月22日

打字计时练习程序设计

1.问题提出及功能要求

设计一个在键盘上练习打字并能统计时间的程序。通过它练习英文打字练习,并能够

统计时间。

要求:在缓冲区中预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,,

每输入完一行后按回车键,可显示出练习输入的时间和下一行例句。按Esc键可退出程序。

2.算法设计

2.1设计思路

在键盘上练习的打字例句及其地址表、计时单元等预先放在DATA数据段中,自编的中

断程序kbint检测按键时产生的中断,并把按键的扫描码转换为ASCII码存入缓存区

buffer,这个工作和R0M09类型的键盘中断例行程序所完成的工作大致相同,只是在解释

各个键时作了简化,即只解释了可显示字符,如英文字母、数字及一些符号;其他特殊键,

如组合键、双态键、功能键等都未作解释,只作为字符码0来处理。在主程序局部保存原

09类型的中断向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后开中断。当键

盘中断处理后,主程序中安排指令读取缓冲区中的字符并显示在屏幕上。在主程序的末尾,

利用DOS功能恢复原09类型的中断向量,然后返回DOS。在显示键入的字符时,还应判断

字符是否为回车(ODH)。如为回车符,说明一个句子输入完毕,此时调用显示时间的子程序

显示出打字时间,然后顺序显示下一个例句。如果所存放的例句都已显示完,那么又从第

一个例句开始显示,直至键入某一功能键(如Esc键、ShifL键等)退出程赤,结束打字

练习。打字时间统计利用自定时器中断处理程序clint来完成。每输完一例句,计时一次。

在此中断例行程序中,定时器中断的次数记录在计数单元count中,当count计数值为18

时,sec计数单元加1,当sec计数值到达60时,min计数单元加1。因为输入完一个句

子无论如何也不会到达小时级,所以对hours计数值的调整判断,实际上只起到退出定时

器中断的作用。

显示时间的子程序disptime分别将各遍野单元的二进制数转换为十进制数,并以

min:sec:msec的形式显示出来。其中msec是由count记数值转换成的:

countX1秒/18.2=countX55ms

2.2程序流程图

******预设置打字练习的句子******

STR1DB'ABCDEFGHIJKLMNOPQRSTUVWXYZ.';句子1

DBODH,OAH,'$'

STR2DB'THEREARESOMENEWSPAPERSONTHETABLE.'

DBODII,OAH,'$'

STR3DB'THEREARESOMECLOUDSINTHESKY.'

DB0D11,OAH,'$'

STR4DB'SHEALWAYSEATSHERLUNCHATNOON.?

DBODH,OAH,'$'

STR5DB'IDONOTLIKEAUTUMNANDWINTER.

CMLFDBODH,OAH,'$'

COLONDB

EVEN

SADDRDWSTR1,STR2,STR3,STR4,STR5

******定义时间参数******

COUNTDW0;记时器记数

SECDW0;秒

MINDW0;分

HOURSDW0;小时

SAVELCDW2DUP(?);1C向量地址

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA,ES::DATA,SS:STACK

MAINPROCFAR

START:

MOVAX,STACK

MOVSS,AX

MOVSP,OFFSETTOE

PUSHDS;现场保护

SUBAX,AX

PUSHAX

MOVAX,DATA

MOVDS,AX

MOVES,AX

;*******将原中断向量09H保存在自设的单元中******

MOVAH,0

MOVAL,4

INT2111

MOVAH,OBH

MOVBlI,0

MOVBL,4

INT11H

MOVAH,35H;取中断向量的功能调用

MOVAL,09H

INT2111

MOV0LDCS9,ES

MOV0LDIP9,BX

;******设置H编处理程序的中断向量******

PUSHDS

MOVDX,SEGKBINT;自编中断类型程序段地址放入DS

MOVDS,DX

MOVDX,OFFSETKBINT;自编中断类型程序偏移地址放入DX

MOVAL,0911

MOVAH,25H;设置中断向量功能调用

INT21H

POPDS

;******将原中断向量1CH保存在自设的单元中******

MOVAH,35H

MOVAL,1CH

INT21H

MOVSAVEJ£,BX

MOVSAVE_LC+2,ES

;******设置自编处理程序的中断向量******

PUSHDS

MOVDX,SEGCLINT

MOVDS,DX

MOVDX,OFFSETCLINT

MOVAL,1CH

MOVAH,25H

INT21H

POPDS

;******允许键盘和定时器中断******

TNAL,21H;允许键盘和定时器中断

ANDAL,11111100B

OUT21H,AL

;******设置显示方,式******

FIRST:MOVAll,0

MOVAL,3

INT1011

;******显示提示信息******

MOVDX,OFFSETPROMPT;显示提示信息

MOVAH,9

INT21H

;******在屏幕上显例如句******

MOVSI,0

NEXT:MOVDX,SADDR[S1];显例如句

MOVAH,09H

INT21H

;******初始化变量******

MOVCOUNT,0;设置初值

MOVSEC,0

MOVMIN,0

MOVHOURS,0

;******允许更高一级的中断******

STI

FOREVER:

CALLKBGET

TESTKBFLAG,80H

JNZENDINT

PUSHAX

CALLDISPCHAR

POPAX

CMPAL,ODH

JNZFOREVER

MOVAL,OAH

CALLDISPCHAR

;******显示时间******

CALLDISPTIME

LEADX,CRLF

MOVAH,09H

INT2111

;******显例如句结束否?******

ADDSI,2

CMPSI,5*2

JNENEXT

JMPFIRST

;******原来的中断向量******

ENDINT:CL1

PUSHDS

MOVDX,SAVE_LC

MOVAX,SAVE_LC+2

MOVDS,AX

MOVAL,1CH;恢复中断向量1CH

MOVAH,25H

INT2111

POPDS

PUSHDS

MOVDX,OLDTP9

MOVAX,OLDCS9

MOVDS,AX

MOVAL,09H

MOVAH,2511

INT21H

POPDS

STI

RET

MAINENDP

;******定时器中断处理程序******

CLINTPROCNEAR

PUSHDS

MOVBX,DATA

MOVDS,BX

LEABX,COUNT

INCWORDPTRtBX]

CMPWORDPTR[BX],18;初始化记数

JNERETURN

CALLINCT

ADJ:

CMPHOURS,12;是否满12小时

JLERETURN

SUBHOURS,12;满足减去12

RETURN:

POPDS

STI

RET

CLINTENDP

INCTPROCNEAR

MOVWORDPTRtBX],0

ADDBX,2

INCWORDPTRtBX];BX内容自增1

CMPWORDPTRtBX],60;和60比拟

JNEEXIT

CALLINCT

EXIT:RET

TNCTENDP

;******显示打字练习时间******

DISPTTMEPROCNEAR;显示时间主段

MOVAX,MIN;分移动到AX存放器

CALLBINDEC;显示数字

MOVBX,0

MOVAL,':'

MOVAH,OEH;显示冒号

INT10H

MOVAX,SEC;秒移动到AX

CALLBINDEC

MOVBX,0

MOVAL,'

MOVAll,OEH

INT10H

MOVBX,COUNT

MOVAL,55D;百分秒

MULBL

CALLBINDEC

RET

DfSPTIMEENDP

******将二进转化为十进显示时间******

BINDECPROCNEAR

MOVCX,100D;显示百位

CALLDECDIV

MOVCX,10D;显示十位

CALLDECDIV

MOVCX,1;显示个位

CALLDECDIV

RET

BINDECENDP

DECDIVPROCNEAR;转化成字符显示

MOVDX,0

DIVCX

MOVBX,0

ADDAL,3OH;转换成ASCII

MOVAH,OEH

INT1OH;显示一个字符

MOVAX,DX

RET

DECDIVENDP

******获取键盘键入的信息******

KBGETPROCNEAR

PUSHBX

CLI

MOVBX,BUFPT1;标志缓冲区的大小

CMPBX,BUFPT2

JNZKBGET2

CMPKBFLAG,0;!二OOH的时候,一直获取键盘

JNZKBGET3

STI

POPBX

JMPKBGET

KBGET2:

MOVAL,[BUFFER+BX]

INCBX

CMPBX,16H

JCKBGET3

MOVBX,0

KBGET3:

MOVBUFPT1,BX

POPBX

RET

KBGETENDP

;******键盘中断处理程序******

KBINTPROCNEAR

PUSHBX

PUSHAX

INAL,6011;键盘输入存放器端口地址

PUSHAX

INAL,6111;控制商品存放器地址

ORAL,80H

OUT61H,AL;读数据

ANDAL,7FH;第八位清0,ASCH只有7位

OUT61H,AL

POPAX

TESTAL,80H

JNZKBINT2

MOVBX,OFFSETSCANTAB;查表输出字符

XLATSCANTAB;查表

CMPAL,0

JNZKBINT4

MOVKBFLAG,80H

JMPKBINT2

KBINT4:

MOVBX,BUFPT2

MOV[BUFFER+BX],AL

INCBX

CMPBX,16H

JCKBINT3

MOVBX,0

KBINT3:

CMPBX,BUFPT1

JZKB1NT2

MOVBUFPT2,BX

KBINT2:CLI

MOVAL,20H

OUT20H,AL;送82592送端口

POPAX

POPBX

STI

RET

KBINTENDP

DISPCHARPROCNEAR;显示字符

PUSHBX

MOVBX,0

MOVAH,OEH;显示一个字符在AL里

INT1011;显示一个字条符

POPBX

RET

DISPCHARENDP

CODEENDS

ENDSTART

4.调试与运行

4.1实验步骤:

1)翻开windows命令窗口

2)进入masm程序的安装目录,汇编源文件,如图:

图汇编程序

3)连接程序,并查看生成可执行文件weijia.exe。

图4.1.3查看生成可执行文件

4)关闭对话框,翻开可执行文件weijia.exe,开始打字计时练习。

4.2运行程序:

1)设置主程序段显示提示信息,程序功能应该实现下列图所示:

图程序调试

2)调用DI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论