动画程序设计.docx
《动画程序设计.docx》由会员分享,可在线阅读,更多相关《动画程序设计.docx(27页珍藏版)》请在冰豆网上搜索。
动画程序设计
一、课题的背景
1.1题目:
动画程序设计
1.2要求
要求完成一个在显示器上显示一个图形动画设计,即当程序运行时可看到移动的图形或图像。
(比如:
在出现的提示信息中输入某一个字母,即可让一个图形或图像出现在在屏幕的左边,然后移动到屏幕的右边。
)
此程序涉及到宏和I/O中断的调用,要求我们掌握对宏的定义和使用,使用汇编语言对I/O中断的使用。
学生查阅相关资料,自学具体课题中涉及到的新知识,能够按照老师的要求对待设计的系统的程序流程图进行正确地绘制。
学生在老师的指导下,能够写出相应的源程序代码,采用结构化、模块化程序设计方法,功能要完善,界面要美观。
所设计的系统原则上要能够运行无误,结果准确。
在条件允许的情况下,学生能够最终将系统所要实现的功能演示出来。
最后经验收合格后,按要求写出课程设计报告。
总体设计应配合软件总体模块结构图来说明软件应具有的功能。
详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。
1.3设计内容功能描述
定义数据段,设置主要参数:
设置9号中断向量地址,9号中断向量首址;定义时间参数为秒、分、小时。
在代码段,调用10中断、21中断,整个程序使用序分化各子功能。
本程序主要实现霓虹灯的效果,可以分为三大块:
首先画霓虹灯的形状,其次让组成霓虹灯的符号按一定的规律变色,实现动态效果,最后通过重画实现动画闭幕的效果。
动画的原理实质上是在屏幕上连续的间隔较小的地方显示相同的图案。
由于人眼具有视觉暂留的特性,我们就会看到“运动”的画面。
模块图如下
图1模块图
二、运行环境
软件:
操作系统:
Windous7中文版,MASM,LINK汇编编译连接软件
硬件:
处理器:
Intel(R)Core(TM)i5-4200UCPU@1.60GHz2.30GHz
内存:
4.00GB
硬件空间:
500GB
显卡:
独立显卡
三、各模块的主要功能
3.1模块功能
3.1.1画三角形帘子
此模块要呈现一个三角形帘子的图形,首先要选用组成帘子的符号,在这里我选用了@和*,也可以根据要求选择其他符号,@的ASCII码是40H,*的ASCII是2AH,也可直接将符号用送给寄存器AL,然后调用10中断的9号功能,将其显示出来。
因为要画出固定的图形,所以必须指定光标位置,然后在相应的位置显示,这里指定光标位置学要调用10中断的2号功能,将所需设置的行列号分别送给寄存器DH和DL即可。
后面可以通过行列的变化来画出所需的图形,行列的起始位置和最终位置可以根据实际情况进行设置,每隔一定的时间关标要移动,才能画出完整的图形,所以还需设置延时的时间。
3.1.2变换颜色
此模块主要是想呈现一个灯光闪烁的效果,联系实际,可以通过变换字符的颜色来实现这一效果,画不同颜色的字符同样需要调用10中断的9号功能,把想要变换的颜色属性值存放到寄存器BL即可显示出不同颜色的字符。
变换颜色还需考虑时间和顺序,所以需要根据需要来设置时间和行列变化方向,可根据想要呈现的图形效果具体设计。
3.1.3呈现闭幕效果
此模块主要是想呈现一个闭幕效果,联想现实生活中的闭幕,帘子从两边到中间移动,或从上到下等等,想要使程序呈现出这种动态效果,必须是人眼看到字符是在移动的,而产生移动效果则可通过光标移动在不同地方画相同的字符来实现,同样也需要采用延时,才能显示出更好的效果,本程序基本设计为上下的字符向中间移动。
3.2模块关系
模块化设计方法是按照各部分程序所实现的不同功能把程序划分成多个模块,各个模块在明确各自的功能和相互间的连接约定后,就可以分别编制和调试程序,最后再把它们连接起来,形成一个大程序。
这是一种很好的程序设计方法,而子程序结构就是模块化程序设计的基础。
子程序又称为过程,它相当于高级语言中的过程和函数。
在一个程序的不同部分,往往要用到类似的程序段,这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把这些程序段写成子程序的形式,以便需要时可以调用它。
四、详细设计
4.1各子程序流程图
4.1.1主流程图
程序主要是设计为子程序调用的方法来实现,将各个模块设计为不同的子程序,然后在主程序中来调用这些子程序,每个子程序中都会调用延时子程序,以便达到想要的效果,主程序流程图如下:
图2主流程图
4.1.2画三角形帘子流程图
先画@符号,第四行第四列为起始点,然后再画@的地方重画*,行增加一行,继续画@,然后又重画*,如此重复,直到画@的行为第七行时,就使列增加2列,同样的方法画,直到画@的行为第八行,然后列增加2,用同样的方法画,只是每一列的符号个数依次增加或减少,当符号个数未到5时,就一直画,从每一列一个画到每一列五个,当到了五个时,又从每列五个画到每列一个,直到列数到达74列,整个三角形帘子就实现了,如下图所示:
图3三角形帘子
图4画三角形帘子流程图
4.1.3颜色变换子程序
此程序用于变换三角形帘子的颜色,在相同的地方重画相同的符号,采用不同的颜色画,调用延时程序,从上到下变换颜色,@和*也采用不同的颜色,使@看起来有吊灯的效果。
分别用两种颜色的值赋给定义的变量,判断count的值,当count的值为1时采用一种颜色赋值给cool1和cool2,然后调用本程序,延时后再判断count的值,如果为2就赋另一种值给cool1和cool2,如此循环判断十次,就会呈现出一个变换颜色闪动的效果,颜色变换图形效果如下图所示:
第一种颜色变换:
图5颜色变换一
第二种颜色变换:
图6颜色变换二
图7变换颜色流程图
4.2各子程序代码
4.2.1主程序
此程序设计的是先画三角形帘子,对于此部分,我把它设计为一个子程序,然后在主程序中分别调用来实现想要的效果,具体实现代码如下:
主程序:
code_segsegment
assumecs:
code_seg,ds:
data_seg,ss:
stack
mainprocfar
pushds
subax,ax;寄存器AX清零
subcx,cx;寄存器CX清零
pushax
pushcx
movax,data_seg
movds,ax
movchar,2;定义不同变量,根据变量取
movcount,2;值的不同来实现跳转
movchar0,4
movcool1,0eh;设置颜色的属性值
movcool2,0ah
movcount0,8;调用延时程序的次数
movcount1,10;调用颜色变换子程序的次数
again:
callclear_screen;程序开始清屏
movline_on1,4;设置行列起始位置
movcol_on1,4
callmust_2;调用画三角形子程序
movcount,1
again1:
movline_on1,4
movcol_on1,4
callmust_21;调用颜色变换子程序
cmpcount,1
jneexit0
movcool1,0eh;设置颜色属性值
movcool2,0ah
inccount
jmpexit12
exit0:
movcool1,0ch;设置不同颜色的属性值
movcool2,03h
deccount
exit12:
deccount1;计数,变色次数
jneagain1
movline_on1,4;重设行列值
movcol_on1,4
movline_on2,16
movcol_on2,3
callmust_22;调用闭幕子程序
popcx
ret
mainendp
主程序定义了许多变量,是为后面画图形做一个标志和跳转的作用,这里没有用寄存器的原因是,此程序需要存值的地方很多,而寄存器的数量有限,为避免寄存器的值相互干扰,故另外定义变量。
在主程序中,设定了变量的值,然后调用子程序,依次实现动画效果。
4.2.2画三角形帘子
第一个子程序:
must_2procnear;显示整个画面,当count=1时,显示左边三角,当count=2时显示右
pushax;边三角
pushbx
pushdx
movah,0fh;取当前显示方式
int10h
movcool0,1
plot_next:
movdh,line_on1;设置光标行列
movdl,col_on1
movah,2;置光标位置
int10h
moval,40h;显示字符及其属性
movbl,0ch
pushcx
movcx,1
movah,09;显示字符
int10h
popcx
calldly_qrtr;调用延时子程序
movdl,cool0
cmpchar0,dl
jeexit3
callerase;调用画*的子程序
jmpplot_next
exit3:
cmpcol_on1,74;比较是否到达74列,到了就
jeexit1;结束程序,否则继续执行
cmpcol_on1,38;比较是否到达38列,看是否
jneexit7;画两列五个字符
addcol_on1,2
movcool0,1
movline_on1,4
jmpplot_next
exit7:
addcol_on1,2;列增加2列
movcool0,1
movline_on1,4;每画完一列就将光标重置第四列
cmpcount,1
jeexit5
cmpchar0,5
jeexit4
incchar0;若不为5就加1
jmpplot_next
exit5:
cmpchar0,1
jeexit6
decchar0;若不为1就减1
jmpplot_next
exit4:
deccount
decchar0
jmpplot_next
exit6:
inccount
incchar0
jmpplot_next
exit1:
popdx
popbx
popax
must_2endp
此程序主要是画@和行列的移动,通过行列的变化画出三角形帘子,然后在每个@上面调用erase子程序来画*
第二个子程序:
eraseprocnear
movdh,line_on1;设置行列位置
movdl,col_on1
movah,2
int10h
moval,'*'
movbl,03h
pushcx
movcx,1;画符号的次数
movah,9
int10h
popcx
inccool0
incline_on1
ret
eraseendp
此程序是在must_2指定的行列画*,画完后使行增加一行,继续返回must_2,在行数加一后的地方画@。
4.2.3变换颜色
代码如下:
;----------------------------------------
must_21procnear
pushax
pushbx
pushdx
movah,0fh;设置显示方式
int10h
plot_next1:
movdh,line_on1
movdl,col_on1
movah,2
int10h
movah,8;读取光标位置的字符和属性
int10h
cmpal,'';比较光标位置的字符是为空还是@,或
jeexit9;是*,若为空则增加列,若为@,则设置
cmpal,40h;不同的颜色属性值重画一遍,若为*则同
jneexit10;样设置不同颜色属性值重画一遍
movbl,cool1
jmpexit11
exit10:
moval,'*'
movbl,cool2;重新显示*,颜色不一样
exit11:
pushcx
movcx,1
movah,09
int10h
popcx
exit9:
cmpcol_on1,74;比较是否到达74列,到了则使列为4,
jeexit8;行增加一行
addcol_on1,2
jmpplot_next1
exit8:
calldly_qrtr;调用延时子程序
deccount0
jneexit8
movcount0,10
movcol_on1,4
incline_on1
cmpline_on1,9
jneplot_next1
popdx
popbx
popax
ret
must_21endp
;---------------------------------------
4.2.4增加一个主界面
由于程序界面不是很好看,所以我对程序进行了一个修改,增加了一个主界面,使程序执行不显得仓促,并可重复执行。
在代码段增加菜单如下:
menudb5dup(0ah)
db31dup(''),'MAINMENU',0dh,0ah
db25dup(''),201,21dup(205),187,0dh,0ah
db25dup(''),186,'1.show',186,0dh,0ah
db25dup(''),186,'2.out',186,0dh,0ah
db25dup(''),200,21dup(205),188,0dh,0ah
db28dup(''),'Choice(1,2):
$'
在主函数中进行判断,执行往后跳回菜单项:
callclear_screen
leadx,menu
movah,9
int21h
input:
movah,0
int16h
cmpal,'1'
jnzcp2
jmpstart
cp2:
movah,4ch
int21h
然后在执行完一遍后用jmp语句重新跳转到显示主菜单的地方,这样可以重复执行,也可按2退出。
4.2.5闭幕子程序
首先在最后在第四行和十六行分别画一行@,然后重画*,然后第四行增加一行,第十六行减一行,画@,画完又重画*,如此循环,实现闭幕效果,最后到达中间时,由于上半部分是从第四列起,每隔两列画,直到七十四列,下班部分是从第三列起,直到七十五列,所以当画到中间时,上下就会重合,*就会不满整个空间,直到第十六列的@移动到第四列时,程序结束,这样就呈现了一个闭幕的效果。
4.2.6延时子程序
此程序用于延时,达到人眼所能反应的时间,看出变化效果。
4.2.7清屏子程序
此程序用于清屏,将左上角的位置定在(0,0),右下角的位置定在(24,79),执行后可将整个屏幕上的内容清除掉,然后继续执行后面的内容,此程序用在此时为避免没有清除掉的内容影响霓虹灯的效果。
4.3调试程序
程序的分析、代码的编写完成后,开始对代码进行编译和调试,我们采用masm环境对所编代码进行调式、编译,用DEBUG命令进行调试,程序调试图如下:
图8调试图
4.4程序运行结果
先画@符号,第四行第四列为起始点,然后再画@的地方重画*,行增加一行,继续画@,然后又重画*,如此重复,直到画@的行为第七行时,就使列增加2列,同样的方法画,直到画@的行为第八行,然后列增加2,用同样的方法画,只是每一列的符号个数依次增加或减少,当符号个数未到5时,就一直画,从每一列一个画到每一列五个,当到了五个时,又从每列五个画到每列一个,直到列数到达74列,整个三角形帘子就实现了,图4—2为画三角形帘子的部分动态过程:
图9三角形帘子动态图
在相同的地方重画相同的符号,采用不同的颜色画,调用延时程序,从上到下变换颜色,@和*也采用不同的颜色,使@看起来有吊灯的效果。
分别用两种颜色的值赋给定义的变量,判断count的值,当count的值为1时采用一种颜色赋值给cool1和cool2,然后调用本程序,延时后再判断count的值,如果为2就赋另一种值给cool1和cool2,如此循环判断十次,就会呈现出一个变换颜色闪动的效果。
图10变色动态图一
图11变色动态图二
首先在最后在第四行和十六行分别画一行@,然后重画*,然后第四行增加一行,第十六行减一行,画@,画完又重画*,如此循环,实现闭幕效果,最后到达中间时,由于上半部分是从第四列起,每隔两列画,直到七十四列,下班部分是从第三列起,直到七十五列,所以当画到中间时,上下就会重合,*就会不满整个空间,直到第十六列的@移动到第四列时,程序结束,这样就呈现了一个闭幕的效果。
图12闭幕效果动态图一
图13闭幕效果动态图二
执行时主界面如下图所示:
图14主界面
五总结
在这次的课程设计中,通过实践操作,加深了对汇编语言的了解,增强了汇编的使用能力,有了整体的了解和把握。
汇编语言虽然是门低级语言,解决问题的难度有限,但是它的与计算机硬件的紧密关系使的它有着独特的优点。
汇编语言程序设计虽然是一门低级语言的程序设计,但是它的学习和我们以往所学习的高级语言程序设计又有相通之处:
算法是程序设计的灵魂,而计算机的硬件条件又决定了程序设计的环境。
因此在实践程序设计的过程中,要坚持软件与硬件相结合的原则,多探究计算机的内部构造及执行和相应程序的原理。
课程设计是个小工程,需要从多方面考虑用户的要求,即完善功能又要用户使用起来比较方便,当然也要考虑时间和效率。
课程设计对我们多数初学汇编的学生来说,确实是个一座高峰。
翻越它是要付出诸多努力的。
我也是摸索了好久才弄明白它的。
为了避免寄存器冲突的问题,在设计子程序时,应把所有用到的寄存器都入栈保存,但用来传递参数和结果的寄存器则要注意,不必入栈的就不入栈了,以免得不到预期的结果。
可以把寄存器当作变量来看待,有时候它存储的是数据变量,而有时候它存储的是地址变量(如DI、SI);内存中的数据,按它们的结构关系,则可以把它们看待成数组,我们对数组,可以通过首地址来访问它们。
传递参数和结果的,一般可以用寄存器,也可以用一段内存空间来传递,特别是需要传递的数据较多的时候。
在设计子程序时,往往涉及到许多的循环,这时候就要注意把不该循环的变量要放在循环体外。
两周的汇编语言课程设计结束了,我的收获是很大的。
通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足。
通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握了各个指令的功能,特别是转向指令,掌握了子程序的定义及调用,以及正确地运用DEBUG指令。
在整个程序的编写中,调试占了很大部分的时间。
要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。
通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平另外,我觉得,学习汇编有一个比较大的好处,就是可以了解到在电脑中每一个字节数据的来龙去脉,我觉得学习汇编可以发挥一下自己的空间想像力,特别是对内存中数据的组织、存储关系的想像。
当然,学习汇编还有另一个重要的收获,就是如何处理数据的问题。
六、参考文献
[1]沈美明,温冬婵,IBM-PC汇编语言程序设计(第2版),北京,清华大学出版社,2009年5月
[2]何超,汇编语言程序设计实验与习题解答(第1版),北京,机械工业出版社,2010年4月
[3]蔡启先,王智文,黄晓璐,汇编语言程序设计实验指导(第1版),北京,清华大学出版社,2008年3月
[4]王爽,汇编语言(第2版)北京,清除大学出版社,2008年4月
[5]秦莲,汇编语言程序设计实训教程(第1版),北京,北京交通大学出版社,2005年5月
[6]贺红娟,汇编语言程序设计教程(第1版),北京,清华大学出版社,2009年4月
[7]秦然,汇编语言程序设计实训与解题指南(第2版),大连,大连理工大学出版社,2009年10月
[8]张开成,钟文龙,汇编语言案例教程(第1版),北京,化学工业出版社,2009年3月
[9]谭浩强,C程序设计题解与上机指导(第二版),北京,清华大学出版社,2000年9月。
[10]范立南,谢子殿,单片机原理及应用教程(第1版),北京大学出版社,2006年1月
七、附录
datasegment
movax,tada;初始化DS
movds,ax
code_segsegment
assumecs:
code_seg,ds:
data_seg,ss:
stack
mainprocfar
pushds
subax,ax;寄存器AX清零
subcx,cx;寄存器CX清零
pushax
pushcx
movax,data_seg
movds,ax
movchar,2;定义不同变量,根据变量取
movcount,2;值的不同来实现跳转
movchar0,4
movcool1,0eh;设置颜色的属性值
movcool2,0ah
movcount0,8;调用延时程序的次数
movcount1,10;调用颜色变换子程序的次数
again:
callclear_screen;程序开始清屏
movline_on1,4;设置行列起始位置
movcol_on1,4
callmust_2;调用画三角形子程序
movcount,1
again1:
movline_on1,4
movcol_on1,4
callmust_21;调用颜色变换子程序
cmpcount,1
jneexit0
movcool1,0eh;设置颜色属性值
movcool2,0ah
inccount
jmpexit12
exit0:
movcool1,0ch;设置不同颜色的属性值
movcool2,03h
deccount
exit12:
deccount1;计数,变色次数
jneagain1
movline_on1,4;重设行列值
movcol_on1,4
movline_on2,16
movcol_on2,3
callmust_22;调用闭幕子程序
popcx
ret
mainendp
eraseprocnear
movdh,line_on1;设置行列位置
movdl,col_on1
movah,2
int10h
moval,'*'
movbl,03h
pushcx
movc