汇编动画小汽车程序设计.docx
《汇编动画小汽车程序设计.docx》由会员分享,可在线阅读,更多相关《汇编动画小汽车程序设计.docx(8页珍藏版)》请在冰豆网上搜索。
汇编动画小汽车程序设计
《汇编语言程序设计》
综合程序设计实验报告
题 目:
动画小汽车
1、项目简介
由汇编语言编写程序,进入DOS界面或BIOS界面,汇编语言程序结构有loop循环,子程序调用数据定义等。
有三个界面,主界面,帮助help界面和游戏界面(小车动画)在界面上显示小车图形,并有相应的操作界面的说明。
有玩家通过键盘操作,实现小车的基本功能,小车可以上,下,左,右,或一直匀速移动。
2、小组成员具体分工
小组成员:
马晓林,杨金川
马晓林:
主要编写程序,查找错误,学习相关知识,查找相关资料,提出创新思想。
杨金川:
编程查相关资料,书籍,查找错误,讨论问题,提出功能等。
3、需求分析与设计
1、程序结构有loop循环,BIOS文本显示,子程序等。
2、关键指令分析
该程序所涉及的关键指令及分析如下:
指令:
MOV AH,02H/01h INT 21H
DOS键盘操作(INT 21H)的功能02能等待从键盘输入一个字符,但是输入字符,而且不进行Ctrl_C或Ctrl_Break的检查处理。
让操作者可以通过键盘控制小车,例如上、下、左、右的操纵小车
指令:
MOV AH,02H
MOV BH,0
MOV DH,8
MOV DL,0
INT10H
BIOS中断类型10H的功能2设置光标位置。
光标位置的行号设在DH寄存器中,列号设在DL中。
而BH是包含的页号。
使字符在屏幕的相应位置中输出,同时也能使字符串有相应的位置输出,显示相应界面。
指令:
MOV AH,09H
LEA DX,STR(或MOV DX,OFFSET STR1)
INT 21H
DOS显示操作INT 21H的功能9是显示字符串,它要求被显示输出的字符以$字符(24H)作为定界符。
而DS:
DX=缓冲区首地址,所以将字符串的首地址附给DX。
显示字符串。
例如:
显示出界面的字符串,让玩家知道如何操作界面。
指令:
MOV AH,6
MOV AL,0
MOV BH,09FH
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,79
INT 10H
INT10H的功能6能使屏幕内容上卷的行,这个功能需要设置7个参数。
其中AL=0初始化窗口,就是清屏的功能。
而CH/CL=左上角行/列号,DH/DL=右下角行/列刷新屏幕,显示出设定颜色的屏幕,同时刷新,使小车移动时候,清除旧的小车痕迹。
MOVah,0fh ;读取当前显示方式,显示小车图案应用
int10h
3、运行环境
通过MasmforWindows集成实验环境编写代码,执行并运行程序,分析修改代码。
4、程序功能主要有:
(1)清屏,显示出背景属性。
(2)置光标位置显示字符及其属性,显示字符串,给予玩家操作界面的说明。
(3)判断键盘输入,查看玩家输入的键,得到相应的操作。
(4)玩家开始游戏,通过相应的操作控制小车。
(5)循环第一至第四的功能。
(简要说明:
进入DOS/BIOS界面,主界面显示出字符串,给予玩家操作提示,能开始游戏(run),查看操作说明(help),退出(exit),如果开始,玩家能同过‘w’,‘s’,‘a’,‘d’等键盘输入控制小车上、下、左、右,还有‘1’键是小车一直移动,同时‘q’为返回或退出,任意键为退出。
校车驶出车道会退出界面
5、程序流程:
4、代码及分析
datasegment
cardb11 ;小车图案
db0b1h,70h,0,0
db0b1h,70h,0,1
db052h,70h,0,1
db0dbh,7,1,2
db0dbh,7,0,-1
db0dbh,7,0,-1
db0dbh,7,0,-1
db0dbh,7,0,-1
db04fh,7,1,0
db04fh,7,0,4
db03ah,7,0,3
roaddb80dup('*') ;车道
m1db10 ;定义小车的起始位置
m2db10
dataends
data1segment ;主页面提示
str1db0ah,0dh,20dup(?
),"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
db0ah,0dh,20dup(?
)," huanyingcomeinzhuyemian!
!
!
"
db0ah,0dh
db0ah,0dh,20dup(?
),"***************************************"
db0ah,0dh,20dup(?
),"* pleaseenterthechose !
*"
db0ah,0dh,20dup(?
),"*1. enter'r'comeingameyemian !
*"
db0ah,0dh,20dup(?
),"*2. enter'q'goquit !
*"
db0ah,0dh,20dup(?
),"*3. enter'h'comeinhelpyemian !
*"
db0ah,0dh,20dup(?
),"*4. enter'0'restartenter !
*"
db0ah,0dh,20dup(?
),"***************************************:
$"
str2db0ah,0dh,20dup(?
),"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
db0ah,0dh,20dup(?
)," huanyingcomeinhelpyemian!
!
!
";help页面
db0ah,0dh
db0ah,0dh,20dup(?
),"*******************************"
db0ah,0dh,20dup(?
),"* pleasewatchthechose!
*"
db0ah,0dh,20dup(?
),"*\ enter'd'thecar-> !
*"
db0ah,0dh,20dup(?
),"*\ enter'a'thecar<- !
*"
db0ah,0dh,20dup(?
),"*\ enter'w'thecarup !
*"
db0ah,0dh,20dup(?
),"*\ enter's'thecardown!
*"
db0ah,0dh,20dup(?
),"*\ enter'1'thecarmove!
*"
db0ah,0dh,20dup(?
),"*******************************************"
db0ah,0dh,20dup(?
),"*1. enter'1'restartcomeback'yemian'!
*"
db0ah,0dh,20dup(?
),"*2. enter'r'comein gameyemian !
*"
db0ah,0dh,20dup(?
),"*3. enter'q'quitgame !
*"
db0ah,0dh,20dup(?
),"*******************************************:
$"
data1ends
codesegment
assumeds:
data,cs:
code
start:
movax,data
movds,ax
again:
callclear ;调用清屏
callyemian ;调用主页面
movah,01h
int21h
cmpal,72h ;输入r,跳转到game页面
jegame
cmpal,68h ;'h'调用help页面
jehelp
cmpal,30h ;输入0,跳转到again
jestart1
cmpal,71h
jeout1 ;输入r,跳转到game页面
out1:
movah,4ch
int21h
start1:
calldelay1 ;调用延时
jmpagain
game:
callgame1
yemianprocnear;*****主页面显示选择**********
movax,data1
movds,ax
pushax
pushbx
pushcx
pushdx
movah,2 ;显示方式
movbh,0
movdh,5
movdl,0
int10h
movdx,offsetstr1
movah,9
int21h
popdx
popcx
popbx
popax
ret
yemianendp ;************************
helpprocnear;*****help页面显示选择**********
movax,data1
movds,ax
callclear
pushax
pushbx
pushdx
movah,2 ;显示方式
movbh,0