打字练习程序.docx
《打字练习程序.docx》由会员分享,可在线阅读,更多相关《打字练习程序.docx(25页珍藏版)》请在冰豆网上搜索。
打字练习程序
信息科学与技术学院
微机原理与接口技术课程设计
课题名称:
打字练习程序
学生姓名:
孟健
学号:
2006081778
专业、年级:
计科06-2
指导教师:
农峰
时间:
2008.9.4
1、题目及要求:
1.1、题目:
打字练习程序
1.2、要求:
1)、缓冲区中预放了一些字母
2)、运行时,可按照屏幕上显示的字母输入练习
3)、当按结束,可显示出练习输入的时间,并且能显示出正确率。
4)、要求界面美观。
2、功能设计:
2.1、功能模块:
主程序模块-----主要是随机产生字符并将字符送入缓冲区,调用其他子程序和宏设置窗口及时间、字符总数和正确个数。
打字结果计算与显示模块(UseTimeAndOut,RightRata_out)-----主要计算所用时间及正确率并输出。
设置字符颜色模块(clew_char)-----主要设置打字时缓冲区字符和打字区字符的颜色,包括错误时字符的颜色显示。
字符满行处理模块(isFullLine)-----主要功能是当字符输入满行时进行换行。
输出模块(OutTime,btod_out)-----输出程序运行时的时间。
统计模块(Tongji)-----统计字符个数和正确个数并记录时间。
宏的作用:
清屏(Clear)-----用于按要求清理屏幕(不同颜色),以便产生想要的窗口。
设置光标位置(SETGB)-----用于移动光标位置,以便按要求输出。
读光标位置(READGB)-----用于读取当前光标位置。
提示(Tishi)-----用于输出提示语句。
2.2、功能图:
3、详细设计:
3.1、设计方法:
该课程设计只是应用了些简单的函数调用,中断,宏调用。
其中随机产生字符的实现是通过调用中断(ah=2ch,int10)取系统时间的1/100来得到一组随机数,把这些随机数当做指针,然后取指针对应的字符表中相应的字符,来得到一串字符。
在把结果显示到屏幕上时将数据拆分后输出到屏幕上。
如‘123’在屏幕上显示时必须一个一个输出,还有在输出小数点时也采取了相应的办法。
在计算时间上记录系统在打字开始和结束时的时间,然后相减得到。
在打字时通过比较记录正确个数,最终除以总个数得到正确率。
在打字过程中还通过设置字符属性来区分正确和错误字符的不同。
3.2、各功能模块及流程图
输出正确率模块计算打字时间并输出模块
数据打印输出模块
记录当前时间和改变字符颜色模块
正确个数及已打个数模块
3.3重点难点及解决办法:
刚开始看到这个题目的时候,我感觉这个题目还是很简单的,在数据区直接存放一串字符,接着输入字符与已有字符做比较,记录正确个数和总的字符个数,然后二者一除就得到正确率了,至于打字时间就是取两次系统时间,结束和开始时间相减便得到了。
当我着手做时我才发现这并不是我想象的那样。
我遇到的第一个问题就是怎么把字符串显示在屏幕上指定的位置及在打字时怎么看到自己在打那个字符(我们不可能去数吧!
),经过查阅资料我学到了用光标定位和设置字符的颜色来解决这一问题。
其次我遇到的问题是怎么才能在屏幕上正确的显示信息,当要在屏幕上显示‘12:
21:
23’,‘12.2%’,‘123’这些时我该怎么解决呢?
我最终的解决办法是将字符拆开一个一个输出。
在本程序中已知字符串我采用了随机产生,在随机产生时我遇到的问题是产生的字符由于程序运行时间太短而都是同一字符,后来我通过延时解决了这个问题。
4、总结:
通过多次的实践,使我深切的体会到培养动手能力的重要性,程序设计是一门实践性很强的东西,不仅要学好书本知识,那是远远不够的,还必须随时把所学知识投入实际应用之中,在此过程中多参照些相关资料,只有这样,才能达到学习的目的,才能学好一门编程语言。
这次实践中,我感觉到自己掌握的只是太匮乏了,太不深刻了,当用到某个知识点时,经常是脑子了有个印象,而确切的却想不起来,幸亏还可以查阅资料要不就什么也不会了。
通过这次实践,我觉的必须很熟练的掌握专业知识,才能很顺畅的编程,才能提高效率,考虑问题也会更全面,编写的程序也会很健壮。
5、参考文献:
[1]《IBM-PC汇编语言程序设计》沈美明清华大学出版社2001年8月第2版
[2]《IBM-PC汇编语言程序设计例题习题集》沈美明清华大学出版社1991年6月第1版
[3]《微机系统和接口应用技术》朱世鸿著清华大学出版社2006年9月第1版
6、附:
源程序
;---------------------------------------------
COLORCHARMACROchar,color
pushax
pushbx
pushcx
pushdx
movah,9h;在光标位置显示字符和字符属性
moval,char;AL字符
movbh,0;显示页
movbl,color;字符属性
movcx,1;字符重复个数
int10h
movah,03h;读光标位置;DH:
DL=行:
列
movbh,0;显示页号
int10h
movah,02;置光标位置
incdl;列
int10h
popdx
popcx
popbx
popax
ENDM
;---------------------------------------
BACKCHARMACROchar,color
movah,02h;
movdl,08h;退格
int21h
COLORCHARchar,color
ENDM
;---------------------------------------
CLEARMACROalz,bhz,chz,clz,dhz,dlz;清屏窗口
pushax
pushbx
pushcx
pushdx
moval,alz;上卷行数
movbh,bhz;卷入行属性
movch,chz;左上角行数
movcl,clz;左上角列数
movdh,dhz;左下角行数
movdl,dlz;左下角列数
movah,06h
int10h
popdx
popcx
popbx
popax
ENDM
;---------------------------------------
;------------------------------------------
SETGBMACRObhz,dhz,dlz;设置光标位置
pushax
pushbx
pushcx
pushax
movbh,bhz;显示页号
movdh,dhz;行
movdl,dlz;列
movah,2;置光标位置
int10h
popdx
popcx
popbx
popax
ENDM
;-------------------------------------------
READGBMACRObhz;读光标位置
pushax
pushbx
pushcx
pushdx
movbh,bhz;显示页号
movah,03h;读光标位置
int10h
movgbattr[0],dh;记录光标行
movgbattr[1],dl;记录光标列
popdx
popcx
popbx
popax
ENDM
;-------------------------------------------
LINEFULLMACROlmax,lact
pushax
pushbx
pushcx
pushdx
movax,lact
cmpax,0
jzLFEXIT
movdx,0
cwd
movbx,lmax
divbx
cmpdx,0
jzLNFU
jmpLFEXIT
LNFU:
movFullFlag,1
LFEXIT:
popdx
popcx
popbx
popax
ENDM
;------------------------------------------
TISHIMACROrow,col,addrr
pushax
pushdx
SETGB0,row,col;设置光标位置
movah,09h
leadx,addrr
int21h
popdx
popax
ENDM
;------------------------------------------
datasegment
addrrdb400dup('$')
addrr1db'abcdefghijklmnopqrstuvwxyz0123456789$'
addrr2db400dup('$')
Anumberdw0;总字符个数
Rnumberdw0;正确字符个数
LineMaxdw0;满行的字符数
LineActdw0;当前行字符数
FullFlagdb0;满行标志FullFlag=1满行,FullFlag=0未满
gbattrdb2dup(0);存放字符所在行列
Stimedb3dup(0)
tempdb5dup(0)
ts1db'Stime:
$'
ts2db'Rrate:
$'
ts3db'TotalUse-Time:
$'
ts4db'TotalCharacters:
$'
ts5db'Correct-Reta:
$'
ts6db'Pressanykeytoend!
$'
ts7db'AnESCJianKeYiSuiShiTuiChu!
$'
ts8db'***DaZiLianXi***$'
dataends
codesegment
assumeds:
data,cs:
code
start:
movax,data
movds,ax
;----------------------------------------------
movdi,0;随机产生字符
movbx,65
zifu:
movah,2ch
int21h
moval,dl
cbw
movsi,ax
cmpsi,35
jazifu
moval,addrr1[si]
movaddrr[di],al
incdi
decbx
pushdi
pushsi
movdi,400h
Aa1:
movsi,0ffffh
Aa2:
decsi
jnzAa2
decdi
jnzAa1
popsi
popdi
cmpbx,0
jnzzifu
;------------------------------------------
CLEAR0,57h,0,10,23,69
CLEAR0,17H,3,12,22,66
CLEAR0,70h,4,14,22,64
CLEAR0,25H,12,14,14,64
CLEAR0,70h,13,18,13,35
CLEAR0,70H,13,43,13,60
;------------------------------------------
SETGB0,0,30;输出上面提示语句
CLEAR0,25h,0,28,0,49
CLEAR0,25h,2,23,2,54
CLEAR0,57h,1,14,1,64
movah,09h
leadx,ts8
int21h
SETGB0,2,24
movah,09h
leadx,ts7
int21h
;---------------------------------------------
SETGB0,4,14
movdi,0
movcx,0ffffh
AD:
movdl,addrr[di];装载字符
cmpdl,'$'
jzA2
pushdx
movbp,di
CALLisFullLine
popdx
movah,02h
int21h
incdi
loopAD
A2:
movah,2ch;取系统时间
int21h
movStime[0],ch
movStime[1],cl
movStime[2],dh
SETGB0,15,14
CALLTONGJI
movcx,0ffffh
movdi,0h
AS:
cmpaddrr[di],'$'
jnzASnt00
jmpAEND
ASnt00:
movbp,di
CALLisFullLine
movbp,di
CALLclew_char;改变字符颜色
;==========================================
reinput:
;输入字符开始打字
READGB0
movah,01
int21h
cmpal,27;是否退出
jnzal27nt
jmpexit
;------------------------------------------
al27nt:
cmpal,0dh
jnzal0dnt
SETGB0,gbattr[0],gbattr[1]
jmpreinput
al0dnt:
cmpal,08
jnzASnext
cmpgbattr[1],14
jnzASnz
SETGB0,gbattr[0],gbattr[1]
jmpreinput
ASnz:
movah,02h
movdl,''
int21h
movah,02h
movdl,08h
int21h
decdi
decAnumber
pushax
moval,addrr2[di]
cmpal,addrr[di]
jnzAS1nt
decRnumber
AS1nt:
popax
CALLTONGJI
movbp,di
CALLclew_char;改变字符颜色
jmpreinput
;------------------------------------------
;==========================================
ASnext:
incAnumber
CALLTONGJI
movaddrr2[di],al
cmpal,addrr[di]
jnzAER
incRnumber
CALLTONGJI
A3:
incdi
loopAS1;直接跳太远
AS1:
jmpAS
AEND:
jmpexit
AER:
movtemp[1],al
BACKCHARtemp[1],74h
jmpA3
exit:
CLEAR0,07,8,16,17,63
CLEAR0,57,10,20,15,59
TISHI11,24,ts3
callUseTimeAndOut
TISHI12,24,ts4
movbx,Anumber
callbtod_out
TISHI13,24,ts5
callRightRata_out
TISHI14,30,ts6
movah,08
int21h
movah,4ch
int21h
;---------------------------------------------------
RightRata_outprocnear;输出正确率
pushax
pushbx
pushcx
pushdx
movax,Rnumber;正确字符个数
movcx,100
mulcx
divAnumber;字符总数
movbx,ax
CALLbtod_out
pushdx
movah,02h
movdl,'.'
int21h
popdx
movax,dx
mulcx
divAnumber
movbx,ax
CALLbtod_out
movah,2h
movdl,'%'
int21h
popdx
popcx
popbx
popax
ret
RightRata_outendp
;---------------------------------------------------
UseTimeAndOutprocnear;计算打字时间并输出
movah,2ch
int21h
subdh,Stime[2]
jnsSecUnBlow
jzSecUnBlow
adddh,60
deccl
SecUnBlow:
subcl,Stime[1]
jnsMinUnBlow
jzSecUnBlow
addcl,60
decch
MinUnBlow:
subch,Stime[0]
CALLOutTime
ret
UseTimeAndOutendp
;-----------------------------------------------
OutTimeprocnear;显示时间 ch:
cl:
dh
moval,ch
cbw
movbx,ax
CALLbtod_out
movah,02h
movdl,':
'
int21h
moval,cl
cbw
movbx,ax
CALLbtod_out
movah,02h
movdl,':
'
int21h
moval,dh
cbw
movbx,ax
CALLbtod_out
ret
OutTimeendp
;---------------------------------------------------
TONGJIprocnear;记录当前时间和正确个数及已打个数
pushax
pushbx
pushcx
pushdx
READGB0
SETGB0,13,20
CLEAR0,70h,13,18,13,35
movah,09h
leadx,ts1
int21h
movah,2ch
int21h
callUseTimeAndOut
SETGB0,13,45
movah,09h
leadx,ts2
int21h
movax,Rnumber
movbx,ax
callbtod_out
movah,2h
movdl,'/'
int21h
movax,Anumber
movbx,ax
callbtod_out
SETGB0,gbattr[0],gbattr[1]
popdx
popcx
popbx
popax
ret
TONGJIendp
;----------------------------------------------
btod_outprocnear;输出BX中内容把数据打印输出
pushax
pushcx
pushdx
pushbp
movax,bx
movsi,3
rota1:
movbl,10
divbl
movtemp[si],ah
andax,00ffh
decsi
cmpsi,0
jnzrota1
movbp,1
movsi,1
rota2:
movdl,temp[si]
adddl,'0'
cmpdl,'0'
jzbtodeal
movbp,0
btrt1:
movah,02h
int21h
btrt2:
incsi
cmpsi,3
jnarota2
;--------------------------------全部为0时输出一个0
cmpbp,1
jnzRT
movah,2h
int21h
;------------------------------------
jmpRT
btodeal:
cmpbp,1
jzbtrt2
jmpbtrt1
RT:
popbp
popdx
popcx
popax
ret
btod_outendp
;--------------------------------------------------
isFullLineprocnear;满行后换行
pushax
pushbx
movah,gbattr[0]
moval,gbattr[1]
movLineMax,51;满行时为51个字符
movLineAct,bp
LINEFULLLineMax,LineAct;判断是否满行
movbl,FullFlag;满行时为FullFlag=1
cmpbl,0
jzisfexit
READGB0;读光标位置
addgbattr[0],1
subgbattr[1],51
SETGB0,gbattr[0],gbattr[1];设置光标位置
movFullFlag,0;满行标志置0
isfexit:
movgbattr[0],ah;记录光标当前位置
movgbattr[1],al
popbx
popax
ret
isFullLineendp
;--------------------------------------------------
clew_charprocnear;改变字符颜色
pushax
pushbx
pushcx
pushdx
pushsi
READGB0
movax,bp
movbl,51
divbl
movdh,4
movdl,14
adddh,al
adddl,ah
movtemp[0],dh
movtemp[1],dl
SETGB0,temp[0],temp[1]
COLORCHARaddrr