用汇编编写的指法打字练习软件TT.docx
- 文档编号:10998719
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:23
- 大小:19.19KB
用汇编编写的指法打字练习软件TT.docx
《用汇编编写的指法打字练习软件TT.docx》由会员分享,可在线阅读,更多相关《用汇编编写的指法打字练习软件TT.docx(23页珍藏版)》请在冰点文库上搜索。
用汇编编写的指法打字练习软件TT
Init_boardermacrorow,col,char,dhdl,count
Locall1
movcx,count
movdh,row
movdl,col
l1:
movah,02h
movbh,00h
int10h
pushcx
movah,0ah
moval,char
movbh,00h
movcx,01h
int10h
popcx
incdhdl
loopl1
endm
clear_screenmacrotop,left,bottom,right,col;清屏宏定义
movah,06h
moval,00h
movbh,col
movch,top
movcl,left
movdh,bottom
movdl,right
int10h
endm
setcusormacropage,row,column;设置光标位置
movah,02h
movbh,page
movdl,column
movdh,row
int10h
endm
menumacrorow,col,text;菜单显示宏定义
movah,02h
movbh,00h
movdh,row
movdl,col
int10h
movcx,0
movah,09h
leadx,text
int21h
endm
datasegment
;addyourdatahere!
;pkeydb"pressanykey...$"
kaishidb"welcometoplaythegame!
$"
mes0db"=========================================$"
mes1db"1.startgame$"
mes2db"2.select$"
mes3db"3.exit$"
mes4db"=========================================$"
mes5db"selectnumofmenu:
$"
mes12db"=========================================$"
mes13db"1.100letters$"
mes14db"2.200letters$"
mes15db"3.300letters$"
mes17db"=========================================$"
mes18db"CorrectRate:
$"
mes7db"pressanykeytostartthegame...$"
mes8db"pressesckeyreturnmainmenu$"
mes10db"SelectTheLetter'sNum$"
mes19db"wait...$"
mes11db"whenthegamewasover,pressentertorestart$"
mes9db"UsedTime:
$"
mes6db"Thecorrectnumber:
$"
coldb00h,24h,0fdh,0dh;颜色
numdw?
;以输入字母的个数
numbdw?
;输入正确字母的个数
scoredw?
;每轮游戏的分数
gradedw?
sumdw?
ndb26
lettersdb500dup(0)
hourdb0
minudb0
secodb0
ends
stacksegment
dw128dup(0)
ends
codesegment
start:
;setsegmentregisters:
movax,data
movds,ax
moves,ax
;addyourcodehere
;clear_screen0d,0d,24d,79d,07h
Frame1:
clear_screen0d,0d,24d,79d,1eh;清屏
Init_boarder0d,0d,'*',dl,80d;显示边框上一排星号
Init_boarder24d,0d,'*',dl,80d;显示边框下一排星号
Init_boarder0d,0d,'*',dh,25d;显示边框左一排星号
Init_boarder0d,79d,'*',dh,25d;显示边框右一排星号
menu5d,20d,mes0
menu6d,26d,kaishi;显示菜单
menu8d,30d,mes1
menu10d,30d,mes2
menu12d,30d,mes3
menu13d,20d,mes4
menu14d,20d,mes5
inputMenuNum:
movah,7;输入功能号,无回显
int21h
cmpal,'1'
jecallnum1
cmpal,'2'
jecallnum2
cmpal,'3'
jeend1
jmpinputMenuNum;输入不符要求重输
Frame2proc
movdl,al;将选择的功能号显示出来
movah,2
int21h
clear_screen1d,1d,23d,78d,1eh;清屏,边框还存在
menu9d,20d,mes7
menu11d,20d,mes8
;menu12d,30d,mes10
menu13d,20d,mes11
movcx,2000h;隐藏光标
movah,01h;设置光标大小
int10h
movah,7;无回显输入字符
int21h
movcx,1010h;显示光标
movah,01h
int10h
ret
Frame2endp
num1proc
movdl,al;将选择的功能号显示出来
movah,2
int21h
clear_screen1d,1d,23d,78d,1eh;清屏,但边框存在
menu9d,20d,mes7
menu11d,20d,mes8
;menu12d,30d,mes10
menu13d,20d,mes11
movcx,2000h;隐藏光标
movah,01h
int10h
movah,7;无回显输入字符
int21h
movcx,1010h;显示光标
movah,01h
int10h
movnum,100
callplay
ret
num1endp
num2proc
movdl,al;将选择的功能号显示出来
movah,2
int21h
clear_screen1d,1d,23d,78d,1eh;清屏
menu7d,20d,mes10
menu8d,20d,mes12
menu10d,20d,mes13
menu11d,20d,mes14
menu12d,20d,mes15
menu14d,20d,mes17
menu15d,20d,mes5
inputMenuNum1:
movah,07h
int21h
cmpal,'1'
jzm1
cmpal,'2'
jzm2
cmpal,'3'
jzm3
cmpal,27;当输入esc键时退到主菜单
jzFrame1
jmpinputMenuNum1
m1:
callFrame2
movnum,100;设置字符串个数为100
callplay
jmpm4
m2:
callFrame2
movnum,200
callplay
jmpm4
m3:
callFrame2
movnum,300
callplay
jmpm4
m4:
ret
num2endp
playproc
movnumb,0;正确字符个数
clear_screen02d,02d,23,78,1eh;清屏(边框还存在)
leasi,letters
movbx,0
callgetletter;调用生成字符串子程序
menu20d,15d,mes19
setcusor0d,3d,10d;设置光标位置
clear_screen02d,02d,23,78,1eh;清屏(边框还存在)
calloutletter
setcusor0d,4d,10d;设置光标位置
movah,2ch;获取当前时间
int21h
movhour,ch;获取的小时放入hour中
movminu,cl;获取的分钟放入minu中
movseco,dh;获取的秒钟放入seco中
callinputletter
menu20d,5d,mes9
callcounttime
callouttime
menu20d,25d,mes6
movax,numb
callPRINTAX
menu20d,50d,mes18
callCorrectRate
input_quit:
movah,07h
int21h
cmpal,27
jzFrame1
cmpal,0dh
jzcallplay
jmpinput_quit
ret
playendp
;*************************************
;实现随机产生字符串
getletterproc
output_letter:
movah,2ch;获取时间ch为小时,cl为分,dh为秒,dl为1%秒
int21h
moval,dl;将1%秒放入al中
movah,0;将ah置0,ax当被除数
divn;n为26,将商放到al中,将余数放入ah中
movdl,ah;将余数放入dl中
adddl,61h;a的ascii码为61,将余数加上61得到随机产生字母的ascii码
mov[si],dl;将随机产生的字符放入到letters中
incsi;letters的偏移量加1
incbx
callDELAY;计数量加1
cmpbx,num;将已产生的字符量与所需产生的字符数比较
jnzoutput_letter;当小于所需产生的字符数时,跳转至output_letter
mov[si],'$';字符串结束
ret
getletterendp
;*************************************
;实现字符串的换行输出
outletterproc
leasi,letters;获取letters的首地址
again:
movdl,[si];将字符串相应偏移地址里的字符放入dl中
movah,02h;显示字符
int21h
incsi;letters偏移地址加1
cmp[si],'$';判断是否已经到字符串的末尾
jzq2;当已到达字符串末尾时跳转至q2,反之顺序执行
movah,03h;获取光标当前位置dh=行号,dl=列号
movbh,0
int10h
cmpdl,75d;判断光标列号是否为75,即已到达改行末尾
jzq1;当光标列号是为75跳转至q1
jmpagain
q1:
adddh,2d;将当前光标行号加2,实现隔行输出
setcusor0d,dh,10d;重新设定光标位置
jmpagain
q2:
ret
outletterendp
inputletterproc
leasi,letters;获取字符串的首地址
movcx,num;将字符串的长度放入cx中
input:
pushcx;将cx压栈
movah,03h;获取光标当前位置dh=行号,dl=列号
movbh,0;页号为0
int10h
cmpdl,75d;将光标当前列号与75作比较
jzl5;当光标当前列已是75则跳转到l5
l6:
movah,7;输入字符无回显,al接收输入字符的ascii码
int21h
cmpal,08h;判断输入键是否为退格键(退格键ascii码为08h)
jel3;当输入退格键跳转至l3,若不是则往下执行
cmpal,27;判断输入键是否为esc键(esc键ascii码为27h)
jequit;当输入的是esc键,跳转至qiut,若不是则往下执行
cmpal,[si];将输入字符与letters里相应字符比较
jel1;当相等时跳转至l1,反之往下执行
jnel2;当输入的字符与letters里相应字符不相等,跳转至l2
done:
movdl,al;将输入的字符放入dl中
movah,2;输出字符
int21h
incsi;letters的偏移量加1
popcx
deccx
jnzinput
jmpl4
l1:
addnumb,1;输入的字符正确,记录输入输入正确个数的numb加1
movah,09H;在当前光标位置显示字符,不改变光标位置
movbh,0H
movbl,2fh;背景颜色为绿色
movcx,1
int10H
jmpdone
l2:
callSOUND;输入错误
movah,09H;在当前光标位置显示字符,不改变光标位置
movbh,0H
movbl,4fh;Z表示颜色。
movcx,1
int10H
jmpdone
l3:
movah,03h;获取光标当前位置dh=行号,dl=列号
movbh,0;页号为0
int10h
cmpdh,4d;判断当前光标输入字符串的第一行
jadel1;当不在输入字符串的第一行,跳转到del1
cmpdl,11
jbdel
subdl,1;将光标后退一格
setcusorbh,dh,dl
decsi
popcx
inccx
pushcx
del:
movah,08h;读取当前光标位置的字符及属性
movbh,0
int10h
cmpah,2fh;判断字符属性颜色是否为绿色
jzl8;当字符属性颜色为绿色时跳转至l8
l9:
;将需删除的字符用空格代替,并将背景色改为蓝色实现删除
moval,20h;将空格键的ascii码放入al中
movah,09H;在当前光标位置显示字符,不改变光标位置
movbh,0H;页号为0
movbl,1eh;将要显示的背景颜色蓝色放入bl中
movcx,1;循环次数为1
int10H
popcx;循环次数出栈
jmpinput;继续输入
l5:
adddh,2d;将当前光标的行增加2
setcusor0d,dh,10d;重新设置光标位置,实现隔行换行
jmpl6;跳转至l6继续执行
del1:
decsi;letters的偏移地址减1
popcx;将循环计数器的内容出栈
inccx;循环次数加1
pushcx;将cx入栈
cmpdl,10;将光标当前所在列与10比较
jzl7;当光标当前所在列为10,跳转至l7
subdl,1;将光标后退一格
setcusorbh,dh,dl
jmpdel
l7:
subdh,2;将光标的行号减2
setcusorbh,dh,74d;重新设置光标的位置,实现退格时的隔行退格
jmpdel;跳转至del
l8:
subnumb,1;将记录的正确个数减1
jmpl9;跳转至l9
quit:
jmpFrame1;显示主菜单
l4:
ret
inputletterendp
;*************************************
;计算所用时间功能
counttimeproc
movah,2ch
int21h
cmpdh,seco
jbt1
subdh,seco
movseco,dh
sec:
cmpcl,minu
jbt2
subcl,minu
movminu,cl
min:
cmpch,hour
jbt3
subch,hour
movhour,ch
hou:
jmpt4
t1:
adddh,60d
subdh,seco
movseco,dh
cmpcl,1
jbt11
tt:
subcl,1
jmpsec
t11:
addcl,60d
subch,1
jmptt
t2:
addcl,60
subcl,minu
movminu,cl
subch,1
jmpmin
t3:
addch,24
;subch,hour
jmphou
t4:
ret
counttimeendp
;*************************************
;将时间显示出来
outtimeproc;显示时间
moval,hour
movah,0
callPRINTAX
movdl,':
'
int21h
moval,minu
movah,0
callPRINTAX
movdl,':
'
int21h
moval,seco
movah,0
callPRINTAX
ret
outtimeendp
;发声*************************************
SOUNDPROC
pushdx;将dx压栈
pushax;将ax压栈
movdl,7;将响铃符ascii码放入dl中
movah,2;显示字符功能
int21h
popax;将ax出栈
popdx;将dx出栈
RET
SOUNDENDP
;*************************************
;将16进制转化为十进制并输出
PRINTAXPROC;以10进制输出AX中的无符号整数.
MOVBX,10;按10进制输出.
ORAX,AX
JZ_0_
LOOP_P:
XORDX,DX
DIVBX;除法,DX放余数,AX放商
MOVCX,AX;商.
ORCX,DX
JZ_E_;若商与余数都为0则结束递归.
PUSHDX;保存DX中的余数.
CALLLOOP_P;递归.
POPDX;恢复余数.
ADDDL,'0';变成ASCII码.
JMP_1_
_0_:
MOVDL,'0';是0则直接输出.
_1_:
MOVAH,2
INT21H
_E_:
RET
PRINTAXENDP
;*************************************
;实现延时功能
DELAYprocnear
pushcx
pushax
pushdx
movcx,0FFFFH
D0:
movax,0FFFFH
D1:
movdx,2000
D2:
decdx
jnzD2
decax
jzD1
deccx
jnzD0
popdx
popax
popcx
ret
DELAYendp
;*************************************
;实现正确率计算
CorrectRateproc
pushax
movah,0
moval,100
mulnumb
divnum
callPRINTAX
movdl,25h
movah,02h
int21h
popax
ret
CorrectRateendp
end1:
movax,4c00h;exittooperatingsystem.
int21h
ends
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 编写 指法 打字 练习 软件 TT