汇编打字练习1Word文档下载推荐.docx
《汇编打字练习1Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《汇编打字练习1Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
接着定义我们的数据段代码。
在数据段中,有我们菜单中所需要显示的提示信息,还有要显示在界面上方的字母乱序,以及给显示字母乱序所留出的数据空间。
接下来就是定义堆栈段代码,为各段留下空间。
再下来就是最重要的代码段,因为所有的功能都是在代码段中实现的。
代码段中先实现显示主菜单、按Enter键开始程序和按E退出这几项简单的功能。
接着实现显示字母乱序的功能,主要思想是将字母乱序放到之前定义的寄存器中。
然后实现接受键盘所输入的内容的功能。
如果输入的是Esc,则返回主菜单;
如果输入的是Space,程序就暂停;
如果是正确的字母,改字母就消失。
消失的思想就是在当前字母位置输入空格,然后光标放到下一个下落的字母的位置。
11.1原“typetest.asm”程序结构
打字练习程序的主要流程如图所示。
11.2已经实现的功能(修改的、新编写的)程序结构
设置输入界面,用户输入密码后才能进入主菜单;
iddb1,1,2,3,5,8
infdb?
stringdb0ah,0dh,"
Pleaseenterthepassword(******):
$"
string1db0ah,0dh,"
Thepasswordiswrong,pleaseenterthepasswordagain:
leadx,string
movah,09h
int21h
two:
movcx,6
leasi,id
again:
movah,01h
andal,0fh
cmpal,[si]
jnzone
incsi
incbx
loopagain
jmpexit1
one:
leadx,string1
jmptwo
修改主菜单,在主菜单上显示当天日期;
movcx,6
movbx,0
movah,0
moval,9
s:
pushcx
pushax
out70h,al
inal,71h
movah,al
movcl,4
shrah,cl
andal,00001111b
addah,30h
addal,30h
movbyteptrds:
[bx],ah
[bx+1],al
popax
cmpal,4
jnas1
jmpshorts2
s1:
decal
s2:
cmpal,7
jneok
subal,2
ok:
addbx,3
popcx
loops
movdx,0
movah,9
修改主菜单,增加可供用户选择难度级别的选项。
mes11db"
Hit:
mes12db"
Right:
mes13db"
Score:
movah,01h
cmpal,'
1'
jenext1
2'
jenext2
3'
jenext3
jmpkeyin1
next1:
movbx,9999h
movspeed,bx
jmpnext
next2:
movbx,5000h
next3:
movbx,2000h
next:
修改程序,在屏幕右上角显示用户得分、已输入字母数、正确数。
score_displayproc
Init_place00d,65d
int10h
leadx,mes12
movax,score
callwritedec
Init_place00d,43d
leadx,mes13
ret
score_displayendp
hit_displayproc
movah,0ah
moval,"
"
;
将空格赋值为AL
movbh,00h
movcx,01h
int10h
mov[save],dl
mov[save+1],dh
Init_place00d,55d
leadx,mes11
addhit,1
movax,hit
movdl,[save]
movdh,[save+1]
hit_displayendp
将程序中的“置光标位置”程序段落用宏调用完成,添加“置光标位置”宏定义。
Init_placemacrorow,col;
置光标位置宏定义
movah,02h
movbh,00h
movdh,row
movdl,col
int10h
endm
12对该“打字练习程序”的进一步设想
12.1
设置限定出错次数,到达该出错次数,游戏停止
wrongdb30
mes9db"
GameOver!
decwrong
cmpwrong,0
jnepass
jmpover
over:
clear_screen01d,01d,23d,78d;
清屏
menu03d,33d,mes9
movax,4c00h;
退出程序
13课程设计总结
设计体会
刚拿到这个题目觉得特别难,感觉无从下手。
汇编语言不同于高级语言,对于高级语言,我们心中可以有一个非常清晰的思路,在实现功能的时候非常得心应手。
但汇编语言不同,它是面向机器的语言。
用它编写程序时的思路应该按照机器执行程序的思路来编写,所以这个挑战对我来说非常大。
在编写程序之前,首先要摒弃高级语言思路的干扰。
在做准备工作的时候,我从网上找到了相关的代码,照着别人的步骤感受汇编语言编写程序的思路。
很多地方都不是太明白,但是通过查询课本以及上网找相关资料,还是把一些内容理解了。
在编写的时候,我也是按照别人的思路,一步一步进行。
很多地方看似简单,但是等到自己亲自实践的时候就编的很复杂。
汇编语言的前后联系非常紧密,如果要改一点东西的话整个程序的很多地方都要重新做,可以说是牵一发而动全身。
所以在编写的时候要很仔细,要记住前面已经实现了那些功能,还有那些功能要实现,这些必须记好,否则程序会出错。
通过这次课程设计,我了解了汇编语言编写程序的步骤:
先确定程序要实现的功能,接着定义需要的寄存器、存储器,如果需要的话还要画出流程图。
然后逐个模块实现其功能。
如果将模块分好了,再去实现它的功能就不是那么复杂了。
此次的课程设计,提高了我阅读和分析程序的能力。
因为刚一拿到目标代码时,有太多的不明白,必须一行一行地分析其目的和功能。
而时间又比较紧迫,所以我在比较短的时间里分析出了代码的道理。
在这个过程中我的分析与模仿能力得到了提高。
系统改进
本系统可以改进的地方有很多。
首先我做的界面不够华丽,显得很单调。
其次,字母下落的速度太单一,如果能随着玩的时间增加再加快就更好了。
而且计分系统没把字母输入时间也计算在内。
难度选择时候没有输入其它字符时的处理如果能加上这些功能的话那么程序的可用性以及完整性就有能上一台阶。
14软件使用说明
登入密码:
112358
15附录(参考文献,原代码:
)
[1]李敬兆8086/8088和arm核汇编语言程序设计中国科技大学出版社
[2]沈美明,温冬婵编著IBM—PC汇编语言程序设计(第二版)清华大学出版社出版
[3]罗云彬Windows环境下32位汇编语言程序设计电子工业出版社
[4]【美】KipR.Irvine著,温玉杰等译Intel汇编语言程序设计(第四版)电子工业出版社
[5]吕晓庆80386/80486系统编程实践淅江大学出版社
[6]袁可风汇编语言程序设计江西高校出版社
[7]戴水贵Windows汇编语言程序设计教程清华大学出版社
[8]罗杰INTEL86系列汇编语言程序设计江西科学技术出版社
原代码
;
Assemblyprogramfortestyourtypeskills
Writedbyin06/24/2003
ModifiedbyMishuangin06/06/2005
------------------------------------------------
Init_boardermacrorow,col,char,dhdl,count;
设置边框
Localll
movcx,count
ll:
movah,02h
int10h
pushcx
movah,0ah
moval,char
movcx,01h
popcx
incdhdl
loopll
---------------------------------------------------
clear_screenmacrotop,left,bottom,right;
清屏宏定义
movah,06h
moval,00h
movbh,07h
movch,top
movcl,left
movdh,bottom
movdl,right
movdh,00h
movdl,00h
----------------------------------------------------
menumacrorow,col,text;
菜单显示宏定义
movbh,00h
movdh,row
movdl,col
int10h
movah,09h
leadx,text
int21h
======================================================
includeylib.h
Datasegment
db"
00/00/0000:
00:
00"
'
$'
ZKdb"
WELCOMETOPLAY$"
datedb"
date:
mes0db"
PressEnterkeytocontinue.......$"
mes1db"
Whenaletterisdropping,pleasehitit!
mes2db"
Pressspacekeytopause!
mes3db"
PressESCkeytoreturnmaininterface!
mes4db"
Pressletter'
E'
toexit!
mes5db"
Pleasechoosethedifficulty:
mes6db"
No.1easy$"
mes7db"
No.2normal$"
mes8db"
No.3hard$"
mes10db"
YourScoreis:
Speeddw?
Lettersdb"
jwmilzoeucgpravskntxhdyqfb"
db"
iytpkwnxlsvxrmofzhgaebudjq"
nwimzoexrphysfqtvdcgljukda"
Present_positiondb1
db0
scoredw0
hitdw0
rightdw0
savedb?
Dataends
=========================================================
codesegment
mainprocfar
assumecs:
code,ds:
data
start:
movax,data
movds,ax
moves,ax
movcx,5000h
movah,01h
int10h;
设置光标类型
clear_screen00d,00d,24d,79d;
清屏
exit1:
Init_boarder00d,00d,0ah,dl,80d
Init_boarder24d,00d,0ah,dl,80d
Init_boarder00d,00d,0ah,dh,25d
Init_boarder00d,79d,0ah,dh,25d;
menu05d,15d,ZK;
显示菜单
menu07d,15d,date
int21h
menu09d,15d,mes0
menu11d,18d,mes1
menu13d,18d,mes2
menu15d,18d,mes3
menu17d,15d,mes4
Init_place22d,33d
keyin:
movah,07h;
从键盘输入命令字符
int21h
cmpal,0dh
jebegin
不等就和e做比较
jeexit;
如果相等则转exit
jmpkeyin;
不等跳转到keyin
exit:
movax,4c00h;
begin:
clear_screen00d,00d,24d,79d;
清屏
menu00d,43d,mes13
menu00d,55d,mes11
menu00d,65d,mes12
menu05d,15d,mes5;
menu11d,18d,mes6
menu13d,18d,mes7
menu15d,18d,mes8
keyin1:
clear_screen01d,01d,23d,78d;
Init_boarder23d,01d,01h,dl,78d;
设置边框
Init_place01h,01h
movcx,78
leasi,letters
nextletter:
movah,02h;
显示字母
movdl,[si]
int21h
incsi
loopnextletter
start_game:
movah,2ch
int21h;
调取系统时间chcldh分别存放时分秒
incdl;
自增
cmpdl,78
jnasg1
subdl,78
sg1:
movpresent_position,dl
leadi,letters
adddi,wordptrpresent_position;
将当前列数赋给di
decdi;
自减
movdl,present_position;
将当前列数赋给dl
movah,02h
movdh,01h
int10h;
movcx,21d;
设置循环次数
nextrow:
pushcx
movcx,speed;
设置字母下降速度
wait_for_key:
;
延迟
pushcx
movcx,1000
delay:
loopdelay
pushdx
movah,06h;
从键盘输入字符
movdl,0ffh
popdx
jzpass
cmpal,1bh;
如果键入ESC,则返回主菜单
jeto_start
cmpal,"
如果键入SPACE,则游戏暂停
jnepass0
pause:
pushdx;
暂停处理
movah,06h
将字符和空格作比较
jnepause;
不等则转换至空格
jmppass
to_start:
jmpexit1
pass0:
c