打字练习程序.docx

上传人:b****4 文档编号:4343157 上传时间:2022-11-30 格式:DOCX 页数:25 大小:124.09KB
下载 相关 举报
打字练习程序.docx_第1页
第1页 / 共25页
打字练习程序.docx_第2页
第2页 / 共25页
打字练习程序.docx_第3页
第3页 / 共25页
打字练习程序.docx_第4页
第4页 / 共25页
打字练习程序.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

打字练习程序.docx

《打字练习程序.docx》由会员分享,可在线阅读,更多相关《打字练习程序.docx(25页珍藏版)》请在冰豆网上搜索。

打字练习程序.docx

打字练习程序

信息科学与技术学院

微机原理与接口技术课程设计

 

课题名称:

打字练习程序

学生姓名:

孟健

学号:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1