打字游戏汇编语言课程设计.docx
- 文档编号:3927981
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:33
- 大小:119.64KB
打字游戏汇编语言课程设计.docx
《打字游戏汇编语言课程设计.docx》由会员分享,可在线阅读,更多相关《打字游戏汇编语言课程设计.docx(33页珍藏版)》请在冰点文库上搜索。
打字游戏汇编语言课程设计
汇编语言课程实习报告
实习题目打字游戏
学生姓名陈世虎
班级计科1093班
院系信息学院
指导老师
提交时间2011/6/22
成绩
目录
1课程实习任务………………………………………………………………………1
2基本知识…………………………………………………………………………….1
2.1汇编语言程序结构……………………………………………………………2
2.2关键指令分析…………………………………………………………………2
2.3汇编语言上机过程……………………………………………………………3
3总体分析…………………………………………………………………………….3
3.1程序功能分析…………………………………………………………………3
3.2主程序流程图…………………………………………………………………4
4详细设计…………………………………………………………………………….5
4.1菜单模块………………………………………………………………………5
4.2输入模块………………………………………………………………………5
4.3游戏模块………………………………………………………………………6
4.4游戏结束模块…………………………………………………………………6
4.5速度设置模块………………………………………………………………....6
5代码实现…………………………………………………………………………….7
5.1主程序代码……………………………………………………………………..7
5.2~5.11部分子程序代码…………………………………………………………..8
5.12延时子程序代码……………………………………………………………....14
5.13字母下降子程序……………………………………………………………....15
5.14产生新字母子程序代码……………………………………………………….16
5.17游戏逻辑子程序代码………………………………………………………….17
5.18其他各子程序模块…………………………………………………………….18
6调试过程…………………………………………………………………………...19
7使用说明…………………………………………………………………………...20
8总结………………………………………………………………………………...20
9参考文献…………………………………………………………………………..20
1.课程实习任务
设计题目:
打字游戏
基本功能:
1.在屏幕上显示菜单界面;
2.按回车键出现由26个字母组成的乱序行;
3.其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;
4.按空格键停止,按ESC键返回主菜单,按q键退出程序。
用汇编语言编写,完成设计报告。
2.基本知识
本次设计用的汇编语言基本知识如下:
2.1汇编语言程序结构
主体程序结构框架
datasegment……
dataends
codesegment
assumecs:
code,ds:
data,es:
extra
start:
movax,data
movds,ax……
call****
……
movax,4c00h
int21h
codeends
endstart
子程序结构框架
Nameprocfar
……
Nameendp
宏定义结构框架
Namemacro<参数>
……
Endm
2.2.关键指令的分析
本次设计主要用到算术指令,逻辑指令,控制转移指令等
如loop指令,用于循环执行某条或者某块指令集直到默认的参数(CX)为零,
退出循环,执行loop循环下的下一条指令。
Jmp无条件跳转指令,跳转到一个指定的标号位置。
条件转移指令JZ/JNZ、JE/JNE等等,用于判断相应的标志位是否满足条件,若满足则跳转,不满足就继续往下一条指令执行。
CMP比较指令,用于比较两个数的大小,设置标志位,通常和条件跳转指令关联用。
CALL调用指令,用于调用子程序
Int中断指令,用于中断操作
此外,还有其他的一些指令,比如说加法add指令,减法指令等,本次设计用到了大量的指令。
2.3汇编语言上机过程
a:
建立汇编源程序
b:
编译目标文件(即:
编译为.obj.lst.crf文件)
c:
编译不通过,重新修改
d:
连接为可执行文件
e:
运行编译好的可执行文件
f:
用调试工具调试
3.总体分析
3.1程序功能分析
本次设计的是打字游戏,因此,在屏幕落下字母,输入字母,并且判断输入字母和落下来的字母是否相同,如果相同,则字母消失,否则字母下落到屏幕底部消失。
其具体功能如下:
1.按回车键进入游戏,ESC键退出
2.进入速度选择界面,h键高速,l键低速,s键重新设置速度,其他键默认为普通速度其他键(包括回车键)
3.若进入速度设置界面,输入1-999的数,表示速度为普通速度的百分之几
4.游戏中按esc退出,同时显示游戏总共出现字符数,所得分数,同时提示游戏是否重新开始,y返回主界面,n退出
5.游戏过程中按space键暂停,再次按space键继续进行游戏
3.2主程序流程图
4.详细设计
4.1菜单模块
打开软件,进入的是菜单界面模块,如上图,有两种选择,按enter键进入游戏,按ESC键退出进入程序。
4.2速度选择模块
选择enter进入游戏,那么首先选择设置游戏的速度,有三种可供选择,还可以设置适合自己的速度。
4.3游戏模块
进入游戏,可以开始游戏,一次落下一个字母,当键入一个字母正确时,字母消失,不然待字母落到底端,显示字母。
字母的不同的位置有不同的显示颜色,在前1/3为绿色,在中间的1/3为红色,在最后1/3为红色。
在游戏过程中,可以按esc键退出游戏,按space键暂停游戏,再次按space的时候继续游戏。
4.4游戏结束模块
要退出游戏时,会显示一共落下的字母数,和玩家击中的字母数,还提示信息,是否返回主界面,如果键入y,则返回,n则直接退出程序
4.5设置游戏速度模块
在这里,你可以设置适合自己的速度,如图输入了789,则以普通速度的8倍进行游戏。
5.代码实现
5.1主程序代码
movax,data
movds,ax
moves,ax
RESTART:
callInit
cmpax,0
jeLexit;如果退出
callSpeedChoose
callSetInterface
LgetTime:
callPlayGames
cmpal,0;是否有结束标志
jneLgetTime
LendGame:
callGameOver
CALLIsRestart
cmpal,0
jeLexit;如果退出
movbx,RESTART
jmpbx;重新开始
Lexit:
movax,4c00h
int21h
5.2输出单个数字子程序代码
outnumprocnear;入口参数:
ax,传递ax的值给dx的低八位dl以便输出
movdx,ax
ordl,30h
movah,02h
int21h
ret
outnumendp
5.3;计算数字位数子程序
CountNumprocnear;入口参数:
ax,传递要输出的分数
movcx,1;计算输出位数
cmpax,10
jlLendCount
inccx
cmpax,100
jlLendCount
inccx
cmpax,1000
jlLendCount
inccx
cmpax,10000
jlLendCount
inccx;保存在cx
Lendcount:
ret
CountNumendp;出口参数:
cx,保存数字位数
5.4输出数字子程序
CoutNumprocnear;入口参数:
cx,callCountNum后传递数字位数
pushax
callCountNum;计算数字位数
popax
cmpcx,5;5位数字
jlLsmlth1
movbx,10000
xordx,dx
divbx
pushdx
calloutnum;显示万位数字
popax
Lsmlth1:
;千位数字
cmpcx,4;4位数字
jlLsmallhun1
xordx,dx
movbx,1000
divbx
pushdx;余数
calloutnum;显示千位数字
popax
Lsmallhun1:
;显示百位数字
;cmpax,100
cmpcx,3;3位数字
jlLsmallten1
movbl,100
divbl
pushax
calloutnum;显示百位
popax
moval,ah
xorah,ah;al和ax中放的数一样大小
Lsmallten1:
;显示十位数字
cmpcx,2;3位数字
jlLsmallone1
movbl,10
divbl
pushax
calloutnum;显示十位
popax
moval,ah
xorah,ah;al和ax中放的数一样大小
Lsmallone1:
;显示个位数字
calloutnum
ret
CoutNumendp
5.5游戏结束模块
GameOverprocnear;;游戏结束界面设置和分数显示
clear_screen0,0,24,79,10011111b;蓝色背景白色前景界面
;--------------------------总共字符数,total
menu07,20,score_msg1
movax,total
callCountNum;计算数字位数,出口参数在cx中
movbl,52;
addbl,cl;计算数字输出的列坐标后面紧跟chars输出
pushbx
clear_screen07,52,07,bl,10011100b;分数处颜色为红色
curse07,52
movax,total
callCoutNum;输出数字
popbx
incbl
menu07,bl,score_msg2;用到上面的bl
;------------------score;击中的字符数
menu09,20,score_msg3
movax,score
callCountNum;计算数字位数,返回值在cx中
movbl,33
addbl,cl;列坐标后面紧跟分数score的输出
pushbx
clear_screen09,33,09,bl,10011100b;分数处颜色为红色
curse09,33
movax,score
callCoutNum;输出数字
popbx
incbl
menu09,bl,score_msg2
;------------------
callCountNum;计算数字位数,返回值在cx中
movbl,53
addbl,cl;列坐标
pushbx
clear_screen11,53,11,bl,10011100b;分数处颜色为红色
popbx
incbl
menu12,20,restart_msg;显示是否重新开始
menu14,20,restart_msg1
curse14,48
Legame:
ret
GameOverendp;
5.6返回主菜单模块
IsRestartprocnear;判断程序是否继续
recin:
;重新输入
curse14,51
movah,02h
movdl,''
int21h
curse14,47
leadx,char_yn
movah,0ah
int21h
moval,char_yn[2]
oral,20h
cmpal,'y'
jneisno
moval,1
jmpendre
isno:
cmpal,'n'
jnerecin
xoral,al
endre:
ret
isrestartendp;出口参数:
al,传递值在主程序是否退出,0为退出
5.7输入速度模块
CinNumprocnear
LreCin:
curse13,27
;清除输入垃圾值
movcx,3
movah,02h
Lcout:
movdl,''输入速度设子程序-》
int21h
loopLcout
;输入字符串
curse13,27
leadx,numchar
movah,0ah
int21h
xorcx,cx
movcl,numchar[1];输入数字个数
leasi,numchar[2];输入的最高位数字的偏移地址
xorax,ax;输入数字大小
movbl,10;乘10再加数
L11:
;判断输入是否合法
movdl,[si]
cmpdl,'0'
jlLreCin
cmpdl,'9'
jgLreCin
;乘10再加数
mulbl
subdl,'0'
xordh,dh
addax,dx;加上新数
incsi
loopL11
cmpax,0
jeLreCin
movspeednum,ax;速度值
ret
Cinnumendp
5.8设置速度与其界面模块
SetSpeedprocnear
clear_screen0,0,24,79,10011111B;蓝色背景白色前景界面
menu9,20,set_msg1
menu11,20,set_msg2
menu13,20,set_msg3
menu13,30,set_msg4
callCinNum;输入数字
ret
SetSpeedendp
5.9设置游戏界面模块
SetInterfaceprocnear
clear_screen0,0,0,79,11111101b;分数为暗红色
clear_screen1,0,8,79,11111010b;上1/3为绿色
clear_screen9,0,16,79,11111001b;上1/3为黄色
clear_screen17,0,24,79,11111100b;下1/3为红色
menu0,65,goal_msg;显示分数字符
ret
SetInterfaceendp
5.10选择速度界面
SpeedChooseprocnear
clear_screen0d,00d,24d,79d,10011111b
menu07,18,speed_msg1
menu09,24,speed_msg2
menu11,24,speed_msg3
menu13,24,speed_msg4
menu15,24,speed_msg5
curse07,46
movispeed,1;默认普通速度
movbset,0;默认没有设置速度
movah,01h
int21h
oral,20h;转为小写
cmpal,'s'
jneLnexts
movbset,1
callSetspeed;设置速度
jmpLendChoose
Lnexts:
cmpal,'h'
jneLisSlow
movispeed,2
jmpLendChoose
LisSlow:
cmpal,'l'
jneLendChoose
movispeed,0
LendChoose:
ret
SpeedChooseendp
5.11初始化界面模块
Initprocnear
movletter_y,1;初始化y坐标
movletter_x,0;初始化x坐标
movscore,0;初始化分数,总字符数
movtotal,0;,总字符数
movbset,0;默认没有设置速度
movblife,0;生命置空
movispeed,1;速度置为普通
clear_screen0d,00d,24d,79d,10011111b;主菜单界面为蓝色背景,白色前景
menu05,18,menu0;菜单信息的宏调用
menu08,25,menu1
menu10,25,menu3
menu13,18,menu40
menu23,48,designers
curse12,42
choose:
;输入是否进入游戏
movbx,0;
movah,07h
int21h
cmpal,0dh;是否进入游戏
jnesec_judge
incbx
cmpbx,1;如果进入游戏不用判断是否退出
jzlendi
sec_judge:
cmpal,27;不进入游戏,是否退出
jelendi
jmpchoose;不允许非法输入
Lendi:
pushbx;将bx的值给ax,便于主程序判断是否进入游戏
popax
ret
Initendp
5.12延时子程序模块
Delayprocnear;延时子程序
pushReg;速度比例越高,延时越小(延时=普通延时/比例)
cmpbset,0
jeLnotset;没有设置速度
xordx,dx
movax,16000;
movbx,speednum;除以比例
divbx
;乘100系数放内层循环,防止ax越界
movcx,ax;-------------------------->(16000/比例)*10*1000,16000为普通速度值
jmpL1
Lnotset:
movcx,6000;快速
cmpispeed,2;选择快速6000*10*1000
jeL1
addcx,10000;普通(10000+6000)*10)*1000
cmpispeed,1
jeL1
addcx,20000;慢速(20000+6000)*10*1000
L1:
;--------------第一层----------------
movax,cx;用ax先存放cx的值,第一层
;===========================================
movcx,10;第二层
cmpbset,0
jeL12;没有设置速度的情况下
addcx,990;相当于从10*100到了1000
L12:
pushcx;先把第二层的cx压栈
;*****************************************************
movcx,1000;第三层,不设置速度的情况下循环一万次,
Ldelay:
nop
loopLdelay;第三层循环结束
;****************************************************
popcx;第二层循环继续
loopL12
;============================================
movcx,ax;恢复第一层循环的cx
loopL1;第一层循
;--------------------------------------
popReg
ret
Delayendp
5.13字母下降模块
LetterDownprocnear
movch,letter_y
movcl,letter_x
movdl,''
callLetterShow
incletter_y;下降一格
moval,0
cmpblife,0;生命值为0
jneLnext1
incal
Lnext1:
cmpletter_y,24;到达游戏界面底部
jlLnext2
incal
Lnext2:
cmpal,0;是否该显示新字母
jneLnewletter
movch,letter_y;字母下一行显示
movcl,letter_x
movdl,char
callLetterShow
jmpLendown
Lnewletter:
movblife,1
inctotal;总字符数加1
callGenNewPos
movch,letter_y
movcl,letter_x
movdl,char
callLetterShow
Lendown:
ret
LetterDownendp
5.14产生新字母模块
GenNewPosprocnear
movletter_y,1
incch_index;新字母的偏移量
cmpch_index,ch_count;是否到了字母数组边界
jlLx
movch_index,0
Lx:
incx_index;新x坐标
cmpx_index,x_count;是否到了xpos数组边界
jlLngreater
movx_index,0
Lngreater:
movbx,ch_index
moval,letters[bx];新字母
movchar,al
movbx,x_index
moval,xpos[bx];新位置
movletter_x,al
ret
GenNewPosendp
5.15字母显示模块
LetterShowprocnear
pushReg
movdh,25;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 打字 游戏 汇编语言 课程设计