资源描述
汇编语言专业课程设计论文动画程序设计
学 号:
课 程 设 计
题 目
动画程序设计
教 学 院
计算机学院
专 业
计算机科学与技术
班 级
08级计算机科学与技术(1)班
姓 名
姚星
指导教师
姚莉、杨菲
2010
年
12
月
27
日
课程设计任务书
2010 ~2011 学年第 一 学期
学生姓名:姚星 专业班级:08计算机科学与技术(1)班
指导教师: 姚莉、杨斐 工作部门: 计算机学院
一、课程设计题目:动画程序设计
二、课程设计内容(含技术指标)
要求完成一个在显示器上显示一个图形动画设计,即当程序运行时可看到移动的图形或图像。(比如:在出现的提示信息中输入某一个字母,即可让一个图形或图像出现在在屏幕的左边,然后移动到屏幕的右边。)
此程序涉及到宏和I/O中断的调用,要求学生掌握对宏的定义和使用,使用汇编语言对I/O中断的使用。
三、进度安排
2010年12月13日~2010年12月14日,指导教师进行与课题相关的基础知识点讲解;
2010年12月15日~2010年12月17日,学生进行分组并选定课程设计题目,教师指导学生根据选定题目准备资料;
2010年12月18日~2010年12月19日,设计小组进行总体方案设计和任务分工;
2010年12月20日~2010年12月22日,每人完成自己承担的程序模块并通过独立编译;
2010年12月23日~2010年12月26日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行以及撰写课程设计报告;
2010年12月27日~2010年12月28日,验收、修订课程设计报告、答辩及总结。
四、基本要求
1.晏伯武(组长)、姚莉、杨斐和田嵩组成设计小组。小组成员分工协作完成。要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。
2.查阅相关资料,自学具体课题中涉及到的新知识,能够按照老师的要求对待设计的系统的程序流程图进行正确地绘制。
3.学生在老师的指导下,能够写出相应的源程序代码,采用结构化、模块化程序设计方法,功能要完善,界面要美观。
4.所设计的系统原则上要能够运行无误,结果准确。在条件允许的情况下,学生能够最终将系统所要实现的功能演示出来。
5.最后经验收合格后,按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”20磅,首行缩进2字符。总体设计应配合软件总体模块结构图来说明软件应具有的功能。详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。
目 录
一 概述 1
1
1
2
2
二 总体方案设计 3
主程序设计思想 3
霓虹灯图案设计思想 3
本章小结 5
三 详细设计 6
6
7
12
14
四 程序的调试与运行结果说明 15
15
15
19
20
五 课程设计总结 21
、不足 21
21
参考文献 23
一 概述
汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机硬件特性并能直接控制硬件的唯一语言。
汇编语言程序设计课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。因此,要求我们能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。
对我们掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
培养我们综合运用所学知识独立完成汇编程序课题的能力。使我们能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。
提高我们对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。培养我们从资料文献、科学实验中获得知识的能力,提高我们从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。培养我们勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
动画程序设计
要求完成一个在显示器上显示一个图形动画设计,即当程序运行时可看到移动的图形或图像。(比如:在出现的提示信息中输入某一个字母,即可让一个图形或图像出现在在屏幕的左边,然后移动到屏幕的右边。)
此程序涉及到宏和I/O中断的调用,要求我们掌握对宏的定义和使用,使用汇编语言对I/O中断的使用。
小组成员分工协作完成。要求我们每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。学生查阅相关资料,自学具体课题中涉及到的新知识,能够按照老师的要求对待设计的系统的程序流程图进行正确地绘制。学生在老师的指导下,能够写出相应的源程序代码,采用结构化、模块化程序设计方法,功能要完善,界面要美观。所设计的系统原则上要能够运行无误,结果准确。在条件允许的情况下,学生能够最终将系统所要实现的功能演示出来。最后经验收合格后,按要求写出课程设计报告。总体设计应配合软件总体模块结构图来说明软件应具有的功能。详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。
Windows XP/98/2000操作系统、文本编辑器使用EDIT或NOTEPAD,,,。
定义数据段,设置主要参数:设置9号中断向量地址,9号中断向量首址;定义时间参数为秒、分、小时。在代码段,调用10中断、21中断,整个程序使用序分化各子功能。
二 总体方案设计
主程序设计思想
本程序主要实现霓虹灯的效果,可以分为三大块:首先画霓虹灯的形状,其次让组成霓虹灯的符号按一定的规律变色,实现动态效果,最后通过重画实现动画闭幕的效果。动画的原理实质上是在屏幕上连续的间隔较小的地方显示相同的图案。由于人眼具有视觉暂留的特性,我们就会看到“运动”的画面。
模块图如下:
总体
画三角形帘子
变换颜色
呈现闭幕效果
图2-1 模块图
霓虹灯图案设计思想
(1)画三角形帘子
此模块要呈现一个三角形帘子的图形,首先要选用组成帘子的符号,在这里我选用了@和*,也可以根据要求选择其他符号,@的ASCII码是40H,*的ASCII是2AH,也可直接将符号用送给寄存器AL,然后调用10中断的9号功能,将其显示出来。因为要画出固定的图形,所以必须指定光标位置,然后在相应的位置显示,这里指定光标位置学要调用10中断的2号功能,将所需设置的行列号分别送给寄存器DH和DL即可。后面可以通过行列的变化来画出所需的图形,行列的起始位置和最终位置可以根据实际情况进行设置,每隔一定的时间关标要移动,才能画出完整的图形,所以还需设置延时的时间。
(2)变换颜色
此模块主要是想呈现一个灯光闪烁的效果,联系实际,可以通过变换字符的颜色来实现这一效果,画不同颜色的字符同样需要调用10中断的9号功能,把想要变换的颜色属性值存放到寄存器BL即可显示出不同颜色的字符。变换颜色还需考虑时间和顺序,所以需要根据需要来设置时间和行列变化方向,可根据想要呈现的图形效果具体设计。
(3)呈现闭幕效果
此模块主要是想呈现一个闭幕效果,联想现实生活中的闭幕,帘子从两边到中间移动,或从上到下等等,想要使程序呈现出这种动态效果,必须是人眼看到字符是在移动的,而产生移动效果则可通过光标移动在不同地方画相同的字符来实现,同样也需要采用延时,才能显示出更好的效果,本程序基本设计为上下的字符向中间移动。
(4)本程序所涉及的主要知识点
模块化设计方法:
模块化设计方法是按照各部分程序所实现的不同功能把程序划分成多个模块,各个模块在明确各自的功能和相互间的连接约定后,就可以分别编制和调试程序,最后再把它们连接起来,形成一个大程序。这是一种很好的程序设计方法,而子程序结构就是模块化程序设计的基础。
子程序:
子程序又称为过程,它相当于高级语言中的过程和函数。在一个程序的不同部分,往往要用到类似的程序段,这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把这些程序段写成子程序的形式,以便需要时可以调用它。
INT 10中断:
INT 10中断提供了设置各种文本和图形显示方式的功能,程序只要将给出调用参数,将参数送给相应的寄存器,即可建立某种相应的方式。例如功能00可为当前执行程序初始化显示方式或在文本方式和图形之间切换。显示器一旦设置成图形方式,光标即消失;功能9可在光标位置显示字符和属性,只要设置相应参数即可实现等等。
INT 21中断:
INT 21中断提供一些键盘功能调用,在编写程序时,使用此功能调用非常方便。比如调用功能1,能等待从键盘输入一个字符,并在视频显示器上回显;
调用功能9,能将代码段定义的字符串回显到视频显示器上等等。
本章小结
通过初步的设计,我设计出了程序所要实现的效果,整体把握了程序的实现方法,并整理了整个程序的实现思路,在这过程中,最初想了几种实现方案,最后通过对程序实现的可行性和效率的分析,选了一种最适合的实现方案。通过本阶段的设计、分析,做出了一个总体设计方案。
三 详细设计
程序主要是设计为子程序调用的方法来实现,将各个模块设计为不同的子程序,然后在主程序中来调用这些子程序,每个子程序中都会调用延时子程序,以便达到想要的效果,主程序流程图如下:
开始
定义相关变量
调用清屏子程序
调用画三角形帘子的子程序
重设相关变量
调用10次变换颜色子程序
调用闭幕效果子程序
结束
图3-1 主程序流程图
此程序设计的是先画三角形帘子,对于此部分,我把它设计为一个子程序,然后在主程序中分别调用来实现想要的效果,具体实现代码如下:
(1)主程序:
code_seg segment
assume cs:code_seg,ds:data_seg,ss:stack
main proc far
push ds
sub ax,ax ;寄存器AX清零
sub cx,cx ;寄存器CX清零
push ax
push cx
mov ax,data_seg
mov ds,ax
mov char,2 ;定义不同变量,根据变量取
mov count,2 ;值的不同来实现跳转
mov char0,4
mov cool1,0eh ;设置颜色的属性值
mov cool2,0ah
mov count0,8 ;调用延时程序的次数
mov count1,10 ;调用颜色变换子程序的次数
again: call clear_screen ;程序开始清屏
mov line_on1,4 ;设置行列起始位置
mov col_on1,4
call must_2 ;调用画三角形子程序
mov count,1
again1:
mov line_on1,4
mov col_on1,4
call must_21 ;调用颜色变换子程序
cmp count,1
jne exit0
mov cool1,0eh ;设置颜色属性值
mov cool2,0ah
inc count
jmp exit12
exit0: mov cool1,0ch ;设置不同颜色的属性值
mov cool2,03h
dec count
exit12: dec count1 ;计数,变色次数
jne again1
mov line_on1,4 ;重设行列值
mov col_on1,4
mov line_on2,16
mov col_on2,3
call must_22 ;调用闭幕子程序
pop cx
ret
main endp
主程序定义了许多变量,是为后面画图形做一个标志和跳转的作用,这里没有用寄存器的原因是,此程序需要存值的地方很多,而寄存器的数量有限,为避免寄存器的值相互干扰,故另外定义变量。在主程序中,设定了变量的值,然后调用子程序,依次实现动画效果。
(2) 画三角形帘子部分
先画@符号,第四行第四列为起始点,然后再画@的地方重画*,行增加一行,继续画@,然后又重画*,如此重复,直到画@的行为第七行时,就使列增加2列,同样的方法画,直到画@的行为第八行,然后列增加2,用同样的方法画,只是每一列的符号个数依次增加或减少,当符号个数未到5时,就一直画,从每一列一个画到每一列五个,当到了五个时,又从每列五个画到每列一个,直到列数到达74列,整个三角形帘子就实现了,如下图所示:
* * * * * @ * * * * * * * @ * * * * * * * @ * * * * * * * @ * * * * *
* * * * @ @ * * * * * @ @ * * * * * @ @ * * * * * @ @ * * * *
* * * @ @ * * * @ @ * * * @ @ * * * @ @ * * *
@ * @ @ * @ @ * @ @ * @ @ * @
@ @ @ @ @
图3-2 三角形帘子
第一个子程序:
must_2 proc near ;显示整个画面,当count=1时,显示左边三角,当count=2时显示右
push ax ; 边三角
push bx
push dx
mov ah,0fh ;取当前显示方式
int 10h
mov cool0,1
plot_next:
mov dh,line_on1 ;设置光标行列
mov dl,col_on1
mov ah,2 ;置光标位置
int 10h
mov al,40h ;显示字符及其属性
mov bl,0ch
push cx
mov cx,1
mov ah,09 ;显示字符
int 10h
pop cx
call dly_qrtr ;调用延时子程序
mov dl,cool0
cmp char0,dl
je exit3
call erase ;调用画*的子程序
jmp plot_next
exit3: cmp col_on1,74 ;比较是否到达74列,到了就
je exit1 ;结束程序,否则继续执行
cmp col_on1,38 ;比较是否到达38列,看是否
jne exit7 ;画两列五个字符
add col_on1,2
mov cool0,1
mov line_on1,4
jmp plot_next
exit7: add col_on1,2 ;列增加2列
mov cool0,1
mov line_on1,4 ;每画完一列就将光标重置第四列
cmp count,1
je exit5
cmp char0,5
je exit4
inc char0 ;若不为5就加1
jmp plot_next
exit5: cmp char0,1
je exit6
dec char0 ;若不为1就减1
jmp plot_next
exit4: dec count
dec char0
jmp plot_next
exit6: inc count
inc char0
jmp plot_next
exit1:
pop dx
pop bx
pop ax
must_2 endp
此程序主要是画@和行列的移动,通过行列的变化画出三角形帘子,然后在每个@上面调用erase子程序来画*
第二个子程序:
erase proc near
mov dh,line_on1 ;设置行列位置
mov dl,col_on1
mov ah,2
int 10h
mov al,'*'
mov bl,03h
push cx
mov cx,1 ;画符号的次数
mov ah,9
int 10h
pop cx
inc cool0
inc line_on1
ret
erase endp
此程序是在must_2指定的行列画*,画完后使行增加一行,继续返回must_2,在行数加一后的地方画@。
(1)颜色变换子程序
此程序用于变换三角形帘子的颜色,在相同的地方重画相同的符号,采用不同的颜色画,调用延时程序,从上到下变换颜色,@和*也采用不同的颜色,使@看起来有吊灯的效果。分别用两种颜色的值赋给定义的变量,判断count的值,当count的值为1时采用一种颜色赋值给cool1和cool2,然后调用本程序,延时后再判断 count的值,如果为2就赋另一种值给cool1和cool2,如此循环判断十次,就会呈现出一个变换颜色闪动的效果,颜色变换图形效果如下图所示:
第一种颜色变换:
* * * * * @ * * * * * * * @ * * * * * * * @ * * * * * * * @ * * * * *
* * * * @ @ * * * * * @ @ * * * * * @ @ * * * * * @ @ * * * *
* * * @ @ * * * @ @ * * * @ @ * * * @ @ * * *
@ * @ @ * @ @ * @ @ * @ @ * @
@ @ @ @ @
图3-3 颜色变换一
第二种颜色变换:
* * * * * @ * * * * * * * @ * * * * * * * @ * * * * * * * @ * * * * *
* * * * @ @ * * * * * @ @ * * * * * @ @ * * * * * @ @ * * * *
* * * @ @ * * * @ @ * * * @ @ * * * @ @ * * *
@ * @ @ * @ @ * @ @ * @ @ * @
@ @ @ @ @
图3-4 颜色变换二
代码如下:
;----------------------------------------
must_21 proc near
push ax
push bx
push dx
mov ah,0fh ;设置显示方式
int 10h
plot_next1:
mov dh,line_on1
mov dl,col_on1
mov ah,2
int 10h
mov ah,8 ;读取光标位置的字符和属性
int 10h
cmp al,' ' ;比较光标位置的字符是为空还是@,或
je exit9 ;是*,若为空则增加列,若为@,则设置
cmp al,40h ;不同的颜色属性值重画一遍,若为*则同
jne exit10 ; 样设置不同颜色属性值重画一遍
mov bl,cool1
jmp exit11
exit10: mov al,'*'
mov bl,cool2 ;重新显示*,颜色不一样
exit11: push cx
mov cx,1
mov ah,09
int 10h
pop cx
exit9: cmp col_on1,74 ;比较是否到达74列,到了则使列为4,
je exit8 ;行增加一行
add col_on1,2
jmp plot_next1
exit8: call dly_qrtr ;调用延时子程序
dec count0
jne exit8
mov count0,10
mov col_on1,4
inc line_on1
cmp line_on1,9
jne plot_next1
pop dx
pop bx
pop ax
ret
must_21 endp
;---------------------------------------
(3)闭幕子程序
首先在最后在第四行和十六行分别画一行@,然后重画*,然后第四行增加一行,第十六行减一行,画@,画完又重画*,如此循环,实现闭幕效果,最后到达中间时,由于上半部分是从第四列起,每隔两列画,直到七十四列,下班部分是从第三列起,直到七十五列,所以当画到中间时,上下就会重合,*就会不满整个空间,直到第十六列的@移动到第四列时,程序结束,这样就呈现了一个闭幕的效果。
(4)延时子程序
此程序用于延时,达到人眼所能反应的时间,看出变化效果。
(5)清屏子程序
此程序用于清屏,将左上角的位置定在(0,0),右下角的位置定在(24,79),执行后可将整个屏幕上的内容清除掉,然后继续执行后面的内容,此程序用在此时为避免没有清除掉的内容影响霓虹灯的效果。
整个代码部分的设计,本小组分工合作完成,程序难点在于行列变换的情况较复杂,所以需跳转很多次,定义了许多变量来存放定义的值,起着标志的作用,通过比较值是否与预设的值相等,来实现跳转。完成此部分后,我对子程序设计方法有了更进一步的了解,对于跳转语句的使用更加熟练,程序设计的能力也有所提升,思维更加严谨。
四 程序的调试与运行结果说明
程序的分析、代码的编写完成后,开始对代码进行编译和调试,我们采用masm 环境对所编代码进行调式、编译,用DEBUG命令进行调试,程序调试图如下:
图4—1 调试图
(1)先画@符号,第四行第四列为起始点,然后再画@的地方重画*,行增加一行,继续画@,然后又重画*,如此重复,直到画@的行为第七行时,就使列增加2列,同样的方法画,直到画@的行为第八行,然后列增加2,用同样的方法画,只是每一列的符号个数依次增加或减少,当符号个数未到5时,就一直画,从每一列一个画到每一列五个,当到了五个时,又从每列五个画到每列一个,直到列数到达74列,整个三角形帘子就实现了,图4—2为画三角形帘子的部分动态过程:
图 4—2 三角形帘子动态图
(2)在相同的地方重画相同的符号,采用不同的颜色画,调用延时程序,从上到下变换颜色,@和*也采用不同的颜色,使@看起来有吊灯的效果。分别用两种颜色的值赋给定义的变量,判断count的值,当count的值为1时采用一种颜色赋值给cool1和cool2,然后调用本程序,延时后再判断 count的值,如果为2就赋另一种值给cool1和cool2,如此循环判断十次,就会呈现出一个变换颜色闪动的效果。
图4—3和4—4是霓虹灯动态变色的部分过程:
图 4—3 变色动态图一
图4—4 变色动态图二
(3)首先在最后在第四行和十六行分别画一行@,然后重画*,然后第四行增加一行,第十六行减一行,画@,画完又重画*,如此循环,实现闭幕效果,最后到达中间时,由于上半部分是从第四列起,每隔两列画,直到七十四列,下班部分是从第三列起,直到七十五列,所以当画到中间时,上下就会重合,*就会不满整个空间,直到第十六列的@移动到第四列时,程序结束,这样就呈现了一个闭幕的效果。
图4—5和4—6为闭幕的部分效果:
图 4—5 闭幕效果动态图一
图4—6 闭幕效果动态图二
(1)增加一个主界面
由于程序界面不是很好看,所以我对程序进行了一个修改,增加了一个主界面,使程序执行不显得仓促,并可重复执行。
在代码段增加菜单如下:
menu db 5 dup(0ah)
db 31 dup(' '),'MAIN MENU',0dh,0ah
db 25 dup(' '),201,21 dup(205),187,0dh,0ah
db 25 dup(' '),186,' ',186,0dh,0ah
db 25 dup(' '),186,' ',186,0dh,0ah
db 25 dup(' '),200,21 dup(205),188,0dh,0ah
db 28 dup(' '),'Choice(1,2):$'
在主函数中进行判断,执行往后跳回菜单项:
call clear_screen
lea dx,menu
mov ah,9
int 21h
input:
mov ah,0
int 16h
cmp al,'1'
jnz cp2
jmp start
cp2:
mov ah,4ch
int 21h
然后在执行完一遍后用jmp语句重新跳转到显示主菜单的地方,这样可以重复执行,也可按2退出。
执行时主界面如下图所示:
图5—1 主界面
通过对程序的编译、调试和运行,我对代码的调试方法更加熟悉,并了解到自己程序的不足之处,知道怎样去修改代码以及简化代码。
五 课程设计总结
、不足
在动画程序中,通过行列变化,在相同位子以不同颜色重画相同字符,实现动态灯的效果,让人在视觉上产生美感,程序尚有不足,比如效果不是很多,没有主界面等。
在这次的课程设计中,通过实践操作,加深了对汇编语言的了解,增强了汇编的使用能力,有了整体的了解和把握。汇编语言虽然是门低级语言,解决问题的难度有限,但是它的与计算机硬件的紧密关系使的它有着独特的优点。汇编语言程序设计虽然是一门低级语言的程序设计,但是它的学习和我们以往所学习的高级语言程序设计又有相通之处:算法是程序设计的灵魂,而计算机的硬件条件又决定了程序设计的环境。因此在实践程序设计的过程中,要坚持软件与硬件相结合的原则,多探究计算机的内部构造及执行和相应程序的原理。
课程设计是个小工程,需要从多方面考虑用户的要求,即完善功能又要用户使用起来比较方便,当然也要考虑时间和效率。课程设
展开阅读全文