打字游戏汇编语言课程设计.docx

上传人:b****4 文档编号:3927981 上传时间:2023-05-06 格式:DOCX 页数:33 大小:119.64KB
下载 相关 举报
打字游戏汇编语言课程设计.docx_第1页
第1页 / 共33页
打字游戏汇编语言课程设计.docx_第2页
第2页 / 共33页
打字游戏汇编语言课程设计.docx_第3页
第3页 / 共33页
打字游戏汇编语言课程设计.docx_第4页
第4页 / 共33页
打字游戏汇编语言课程设计.docx_第5页
第5页 / 共33页
打字游戏汇编语言课程设计.docx_第6页
第6页 / 共33页
打字游戏汇编语言课程设计.docx_第7页
第7页 / 共33页
打字游戏汇编语言课程设计.docx_第8页
第8页 / 共33页
打字游戏汇编语言课程设计.docx_第9页
第9页 / 共33页
打字游戏汇编语言课程设计.docx_第10页
第10页 / 共33页
打字游戏汇编语言课程设计.docx_第11页
第11页 / 共33页
打字游戏汇编语言课程设计.docx_第12页
第12页 / 共33页
打字游戏汇编语言课程设计.docx_第13页
第13页 / 共33页
打字游戏汇编语言课程设计.docx_第14页
第14页 / 共33页
打字游戏汇编语言课程设计.docx_第15页
第15页 / 共33页
打字游戏汇编语言课程设计.docx_第16页
第16页 / 共33页
打字游戏汇编语言课程设计.docx_第17页
第17页 / 共33页
打字游戏汇编语言课程设计.docx_第18页
第18页 / 共33页
打字游戏汇编语言课程设计.docx_第19页
第19页 / 共33页
打字游戏汇编语言课程设计.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

打字游戏汇编语言课程设计.docx

《打字游戏汇编语言课程设计.docx》由会员分享,可在线阅读,更多相关《打字游戏汇编语言课程设计.docx(33页珍藏版)》请在冰点文库上搜索。

打字游戏汇编语言课程设计.docx

打字游戏汇编语言课程设计

汇编语言课程实习报告

 

实习题目打字游戏

学生姓名陈世虎

班级计科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;

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

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

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

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