用汇编编写的指法打字练习软件TT.docx

上传人:b****1 文档编号:10998719 上传时间:2023-05-28 格式:DOCX 页数:23 大小:19.19KB
下载 相关 举报
用汇编编写的指法打字练习软件TT.docx_第1页
第1页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第2页
第2页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第3页
第3页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第4页
第4页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第5页
第5页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第6页
第6页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第7页
第7页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第8页
第8页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第9页
第9页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第10页
第10页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第11页
第11页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第12页
第12页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第13页
第13页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第14页
第14页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第15页
第15页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第16页
第16页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第17页
第17页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第18页
第18页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第19页
第19页 / 共23页
用汇编编写的指法打字练习软件TT.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

用汇编编写的指法打字练习软件TT.docx

《用汇编编写的指法打字练习软件TT.docx》由会员分享,可在线阅读,更多相关《用汇编编写的指法打字练习软件TT.docx(23页珍藏版)》请在冰点文库上搜索。

用汇编编写的指法打字练习软件TT.docx

用汇编编写的指法打字练习软件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

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2