汇编语言设计思想.docx
- 文档编号:18324377
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:23
- 大小:50.97KB
汇编语言设计思想.docx
《汇编语言设计思想.docx》由会员分享,可在线阅读,更多相关《汇编语言设计思想.docx(23页珍藏版)》请在冰点文库上搜索。
汇编语言设计思想
一、课程设计目的
通过本次课程设计,主要想到达以下目的:
1.进一步加深对汇编语言的理解,使真正的学有所用。
2.使掌握汇编语言的中断调用功能的应用,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制等。
3能够正确运用书上的语句进展简单功能的设计,在不断的编程与检查问题的过程中提高自己的能力,真正到达学习知识的目的。
4.通过课程设计提高我们的动手实践能力,为我们以后更好的学习汇编语言和其他的相关知识奠定根底,使我们更好的适应现代社会的需求。
5.进一步掌握屏幕输出显示的设计方法
二、课程设计任务
设计一个打字练习游戏。
根本功能:
运行可执行程序程序,出现菜单主界面,按回车键出现由26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按ESC键返回主界面;按空格见暂停;按‘E’退出。
三、总体设计思想〔含流程图〕
用汇编语言实现打字程序的思想:
〔1〕首先用BIOS的10H中断类型的02H功能置光标位置,接着用DOS的21H中断类型的09H功能显示字符串来显示主界面;
〔2〕调用DOS的21H的08H功能,承受从键盘输入的字符到AL存放器,判断AL如果为回车以默认速度开场游戏,如为S键那么进入速度选择界面,如为E键那么退出程序;
〔3〕进入速度选择界面后,调用DOS的21H的08H功能,选择速度后进入游戏。
〔4〕进入游戏后,随机落下一字母,通过21H的06H功能调用,承受从键盘输入的字符到AL存放器,如键入ESC进入成绩界面,如键入空格那么暂停游戏,如没有得到输入或输入错误那么继续下落,输入正确那么字母消失,并通过21H的02H功能调用发生响铃;
〔5〕接着继续下落其他字母,如果落下的字母数大于78个那么退出游戏进入成绩界面。
〔6〕进入成绩界面后通过DOS的21H的02H功能调用显示击中字母的个数和丧失字母的个数,暂停大概2秒钟后自动回到主界面。
〔7〕程序设计流程图如下:
四、程序运行结果
4.1主菜单代码以及运行界面
该代码段定义了主界面所要显示的文字:
〔1〕开场时显示“Weletoplay"
〔2〕然后显示时间和日期“2008/12/28"
〔3〕接着是主界面上的提示语“PressEnterkeytocontinue....,Whenaletterisdropping,pleasehitit!
PressSpacekeytopause!
pressesckeytoreturnmaininterface!
pressleetter"E"toexit!
"
〔4〕本程序可以根据自己的打字水平,自行设计字母的下降速度
〔5〕本汇编程序的缺乏之处是:
当翻开执行文件时,按回车键以外的任何一个键都会使程序界面消失,与开场设想的结果不是太一致;程序会一直执行下去,当最下面的字符已完全消失,上面的字符却依然向下落;本程序里面缺少计时功能并且在打字的过程中无法知道自己的成绩;
对应程序代码:
menumacroop1,op2,op3
movah,02h
movbh,00h
movdh,op1
movdl,op2
int10h
movah,09h
leadx,op3
int21h
datasegment
ZKdb"WELETOPLAY$"
nodb"date:
2008/12/28$"
megdb"pressEnterkeytocontinue.......$"
meg1db"whenaletterisdropping,pleasehitit!
$"
meg2db"pressspacekeytopause!
$"
meg3db"pressESCkeytoreturnmaininterface!
$"
meg4db"pressletter'E'toexit!
$"
speeddw1000d
lettersdb"jwmilzoeucgpravskntxhdyqfb"
db"iytpkwnxlsvxrmofzhgaebudjq"
db"nwimzoexrphysfqtvdcgljukda"
letters_bakdb"jwmilzoeucgpravskntxhdyqfb"
db"iytpkwnxlsvxrmofzhgaebudjq"
db"nwimzoexrphysfqtvdcgljukda"
letter_counterdb0
life_flagdb78dup(0)
position_flagdb78dup(0)
present_positiondb1
dataends
程序运行的主界面图如下:
4.2打字阶段的截图及源代码
在这里可以根据自己打字的速度来检查自己的打字能力,当自己按下的键与当前掉下来的字母一样时,该字母会消失,随之会有新的字母掉下来。
在主干程序设计中将下面的所有字母分为了五个局部,并且下落的字母按比例但不按次序随机出现,这样增加了游戏的趣味性,并且在一定程度上增加了游戏的难度,增加挑战性.
在进展打字练习的过程中,你也许会发现上面的字母下落的顺序是有规律的原因是在代码段写进内存的原始文件是有规律的,如果想改变下落顺序,只需要改变代码段中要写进内存的字母顺序即可,与此功能相关的几个主要代码如下:
in_cycle:
addcx,01h
cmpcx,1000
jnein_cycle
pushdx
movah,06h
movdl,0ffh
int21h
popdx
jzpass
cmpal,1bh
jeto_start1
cmpal,""
jepause
cmpal,[di]
jedisappear
pass:
popcx
inccx
cmpcx,speed
jeprint
jmpout_cycle
pause:
pushdx
movah,06h
movdl,0ffh
int21h
popdx
cmpal,""
jnepause
jmppass
to_start1:
jmpstart
print:
movah,0ah
moval,""
movbh,00h
movcx,01h
int10h
incdh
movah,02h
movbh,00h
int10h
movah,0ah
moval,[di]
movbh,00h
movcx,01h
int10h
popcx
inccx
cmpcx,21d
jeprint_next_letter
jmpnextrow
disappear:
popcx
popcx
movah,0ah
moval,""
movbh,00h
movcx,01h
int10h
jmphit
print_next_letter:
leasi,life_flag
addsi,wordptrpresent_position
decsi
movah,0ah
moval,""
movbh,00h
movcx,01h
int10h
incdh
movah,02h
movbh,00h
int10h
movah,0ah
moval,""
movbh,00h
movcx,01h
int10h
movah,1
mov[si],ah
hit:
movah,02h
movbh,00h
movdh,01h
movdl,present_position
int10h
moval,[di]
addal,7
cmpal,7ah
jaconvey_letter
movah,0ah
movbh,00h
movcx,01h
int10h
mov[di],al
addletter_counter,01h
jmpnextcycle
主干程序运行的界面图:
该程序段实现的功能就是:
进入程序,读初始写入内存中的内容,按顺序显示并下落。
同时读从键盘输入的字母,然后与下落的字母比拟,假设一样就显示空格〔不显示任何东西〕,假设不同,那么原字母继续下落直至进入下一个循环。
五.程序清单
Init_gamemacroop1,op2,op3,op4,op5,op6
movcx,00h
movdh,op1
movdl,op2
op6:
movah,02h
movbh,00h
int10h
pushcx
movah,0ah
moval,op3
movbh,00h
movcx,01h
int10h
popcx
inccx
incop4
cmpcx,op5
jneop6
Endm
clear_screenmacroop1,op2,op3,op4;清屏宏定义
movah,06h
moval,00h
movbh,07h
movch,op1
movcl,op2
movdh,op3
movdl,op4
int10h
movah,02h
movbh,00h
movdh,00h
movdl,00h
int10h
endm
menumacroop1,op2,op3;菜单显示宏定义
movah,02h
movbh,00h
movdh,op1
movdl,op2
int10h
movah,09h
leadx,op3
int21h
Endm
datasegment
ZKdb"WELETOPLAY$"
nodb"date:
2003/6/24$"
megdb"pressEnterkeytocontinue.......$"
meg1db"whenaletterisdropping,pleasehitit!
$"
meg2db"pressspacekeytopause!
$"
meg3db"pressESCkeytoreturnmaininterface!
$"
meg4db"pressletter'E'toexit!
$"
speeddw600d
lettersdb"jwmilzoeucgpravskntxhdyqfb"
db"iytpkwnxlsvxrmofzhgaebudjq"
db"nwimzoexrphysfqtvdcgljukda"
letters_bakdb"jwmilzoeucgpravskntxhdyqfb"
db"iytpkwnxlsvxrmofzhgaebudjq"
db"nwimzoexrphysfqtvdcgljukda"
letter_counterdb0
life_flagdb78dup(0)
position_flagdb78dup(0)
present_positiondb1
dataends
stacksegmentparastack'stack'
db64dup(0)
stackends
codesegment
mainprocfar
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
movletter_counter,00h
movpresent_position,1
leasi,position_flag
movah,00h
movcx,00h
init_postion_flag:
mov[si],ah
incsi
inccx
cmpcx,78d
jneinit_postion_flag
leadi,letters
leasi,letters_bak
movcx,00h
init_letters:
movah,[si]
mov[di],ah
incsi
incdi
inccx
cmpcx,78d
jneinit_letters
movah,00h
leasi,life_flag
movcx,00h
init_life_flag:
mov[si],ah
incsi
inccx
cmpcx,78d
jneinit_life_flag
movcx,00h
movah,01h
orch,00010000b
int10h
clear_screen00d,00d,24d,79d
Init_game00d,00d,0ah,dl,80d,nextsign1
Init_game24d,00d,0ah,dl,80d,nextsign2
Init_game00d,00d,0ah,dh,25d,nextsign3
Init_game00d,79d,0ah,dh,25d,nextsign4
menu05d,15d,ZK;菜单信息的宏调用
menu07h,15d,no
menu09d,15d,meg
menu11d,15d,meg1
menu13d,15d,meg2
menu15d,15d,meg3
menu17d,15d,meg4
put:
movah,02h;设置光标位置
movbh,00h
movdh,22d
movdl,33d
int10h
movah,01h;从键盘输入任意字符
int21h
cmpal,0dh
jespeed3
cmpal,45h
jeexit
exit:
movah,4ch
int21h
speed3:
movax,speed+12
movspeed,ax
jmpbegin
begin:
clear_screen01d,01d,23d,78d;清屏宏调用
clear_screen01d,01d,23d,78d
Init_game23d,01d,01h,dl,78d,nextsign5
movah,02h
movbh,00h
movdh,01h
movdl,01h
int10h
movcx,00h
leasi,letters
nextletter:
movah,02h;显示字母
movdl,[si]
int21h
incsi
inccx
cmpcx,78d
jenextcycle
jmpnextletter
from_front:
subpresent_position,78d
jmpgobackto_si
find_zero:
cmpletter_counter,78d
jerecycle
cmppresent_position,78d
jefrom_one
movah,00h
nextsi:
addpresent_position,01h
incsi
cmp[si],ah
jegobackto_di
cmppresent_position,78d
jefrom_one
jmpnextsi
from_one:
movpresent_position,01h
jmpgobackto_si
recycle:
movletter_counter,00h
movpresent_position,01d
leasi,position_flag
movcx,00h
movah,00h
clearsi:
mov[si],ah
inccx
cmpcx,78d
jenextcycle
incsi
jmpclearsi
nextcycle:
leadi,letters
leasi,position_flag
addpresent_position,31d
cmppresent_position,78
jafrom_front
gobackto_si:
addsi,wordptrpresent_position
decsi
movah,[si]
cmpah,01h
jefind_zero
gobackto_di:
movah,01h
mov[si],ah
adddi,wordptrpresent_position
decdi
movdl,present_position
movah,02h
movbh,00h
movdh,01h
int10h
movcx,00h
nextrow:
pushcx
movcx,00h
out_cycle:
;延迟
pushcx
movcx,00h
in_cycle:
addcx,01h
cmpcx,1000
jnein_cycle
pushdx
movah,06h;从键盘输入字符
movdl,0ffh
int21h
popdx
jzpass
cmpal,1bh;如果键入ESC,那么返回主菜单
jeto_start1
cmpal,"";如果键入SPACE,那么游戏暂停
jepause
cmpal,[di];输入字母正确!
那么字母消失
jedisappear
pass:
popcx
inccx
cmpcx,speed
jeprint
jmpout_cycle
pause:
pushdx;暂停处理
movah,06h
movdl,0ffh
int21h
popdx
cmpal,""
jnepause
jmppass
to_start1:
;返回主菜单
jmpstart
print:
movah,0ah;在当前光标位置写空格
moval,""
movbh,00h
movcx,01h
int10h
incdh
movah,02h;改变光标位置
movbh,00h
int10h
movah,0ah;在当前光标位置写字母
moval,[di]
movbh,00h
movcx,01h
int10h
popcx
inccx
cmpcx,21d
jeprint_next_letter
jmpnextrow;下一行
disappear:
;击中字母后输出空格
popcx
popcx
movah,0ah
moval,""
movbh,00h
movcx,01h
int10h
jmphit
print_next_letter:
leasi,life_flag
addsi,wordptrpresent_position
decsi
movah,0ah
moval,""
movbh,00h
movcx,01h
int10h
incdh
movah,02h
movbh,00h
int10h
movah,0ah
moval,""
movbh,00h
movcx,01h
int10h
movah,1
mov[si],ah
hit:
movah,02h
movbh,00h
movdh,01h
movdl,present_position
int10h
moval,[di];出现下一个新字母的数法
addal,7
cmpal,7ah
jaconvey_letter
movah,0ah
movbh,00h
movcx,01h
int10h
mov[di],al
addletter_counter,01h
jmpnextcycle
convey_letter:
subal,7ah
addal,61h
movah,0ah
movbh,00h
movcx,01h
int10h
mov[di],al
addletter_counter,01h
jmpnextcycle
clear_screen01,01,23,78
movah,02h
movbh,00h
movdh,11d
movdl,20d
int10h
incdh
incdh
movah,02h
movbh,00h
int10h
notkey:
movah,07h
int21h
cmpal,0dh
jeto_start
cmpal,1bh
jeover
jmpnotkey
to_start:
clear_screen00,00,24,79
jmpstart
over:
clear_screen01,01,23,78
movah,02h
movbh,00h
movdh,11d
movdl,15h
int10h
movah,02h
movbh,00h
movdh,13d
movdl,15h
int10h
movah,07h
int21h
movah,07h
int21h
clear_screen00,00,24,79
movax,4c00h
int21h
mainendp
codeends
endstart
七.课程设计总结和体会
通过本次课程设计,我不仅对课本上的根底知识有了更近一步的认识,自己的动手操作能力也得到了很大的提高。
在本次课程设计过程中,我认真阅读了很多资料,包括王爽编写的关于汇编方面的资料,并且也参考了网上的很多有价值的东西。
以前对汇编语言总有一种很强的畏惧感,怎么看都觉得很难看懂,但是经过认真投入的钻研〔虽然知道的依然很少〕之后,才发现汇编语言其实很有趣味。
在学习过程中,我还加发现了一个很好的“汇编网〞,在这里面可以随时提出自己不会的东西,都有好多感兴趣的人帮你解答,自己也可以写写感想,做做里边的习题,到达提高自己水平的目的
总体来说这次课程设计很成功,最后运行的结果也跟自己设想得很一致,但是由于程序中也才能在以下缺乏之处:
当翻开执行文件时,按回车键以外的任何一个键都会使程序界面消失,与开场设想的结果不是太一致;程序会一直执行下去,当最下面的字符已完全消失,上面的字符却依然向下落;本程序里面缺少计时功能并且在打字的过程中无法知道自己的成绩;在字符下落过程中只有按esc键才能回到主界面,随后按任何键都会退出程序,而不仅仅是按“E〞键。
八.参考文献
1.?
微计算
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 设计 思想