动画心课程设计.docx
- 文档编号:30287848
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:20
- 大小:91.69KB
动画心课程设计.docx
《动画心课程设计.docx》由会员分享,可在线阅读,更多相关《动画心课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
动画心课程设计
郑州航空工业管理学院
微机原理课程设计说明书
2012级电气工程及其自动化专业972班级
题目动画心
姓名邢爱中学号120697231
指导教师王义琴职称
二О一二年十二月十五日
摘要:
此次微机原理课程说明书根据设计任务阐述动画心汇编程序的设计基本思想与方案,绘制程序流程图,运用8086CPU提供的指令、伪指令、宏指令及DOS,BIOS功能调用编写程序源代码,同时给出说明注释。
并利用计算机提供的软件调试工具对所编写程序进行调试,记录下整个调试分析的过程与运行结果。
关键词:
动画心、汇编语言、方案、程序原代码、调试。
一.动画心的基本原理
本程序主要是利用BIOS功能调用的10H中断类型实现的。
利用其12号功能,设置像素的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画对角线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。
画完图形之后延时,清屏。
同时,利用DOS系统功能调用的08号功能,从键盘输入字符。
如果是任意键,则进入图形显示;如果是空格键,则改变“心”的大小;如果是其它键,则重新显示整个图形;如果是“q”键,则退出。
二、设计方案
2.1.设计内容
设计一彩色动画的程序,一个颜色方框从四周向中间由大变小,并留下痕迹,中心位置出现一颗红“心”。
2.2.设计要求
(1)按任意键进入图形显示;
(2)按空格键重复出现“心”;
(3)按回车键将重复整个图形;
(4)q键退出程序。
2.3.设计思路
本程序主要是利用BIOS功能调用的10H中断类型实现的。
利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画斜线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。
画完图形之后延时,清屏。
同时,利用dos功能调用的08号功能,从键盘输入字符。
如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变“心”的大小;如果是“q”键,则退出。
该系统只是简单的运用字符进行设计组成相应的图像,运用masm编程工具、link连接程序在debug环境下进行调试而成。
在系统中界面中,首先是按下任意键进入动画心界面。
然后会按Q键退出的提示信息,其中包含2个隐藏信息:
按空格键刷新心型图案,来实现动态心;按其余键是重复动画心的显示。
其中主要运用的指令有:
push(压入堆栈);Pop(从堆栈中释放首地址的内容);sub(减法指令);add(加法指令);mov(传送指令);call(过程调用指令);lea(地址传送指令);inc(加一指令);cmp(比较指令);jmp(跳转指令);jnz(条件跳转指令)。
3.1主程序设计
先设置图形显示方式为320*200彩色图形方式、背景色为蓝色和设置彩色组,再利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画斜线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。
画完图形之后延时,清屏。
同时,利用dos功能调用的08号功能,从键盘输入字符。
如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变“心”的大小;如果是“q”键,则退出。
在编写主程序时遇到了一些问题,我们在运行时发现了错误,后来发现在调用dos的08号功能时时出现了错误,通过查看资料发现在调用dos的08号功能时应该在AL中存放输入字符的ASCII码,而我们直接输入的字符。
在画方框、对角线、任意水平线时先是设置cx,bx,dx各个寄存器赋予不同的初值,但我们在开始的时候没有把初值设置好,结果造成了程序的出错,后来经过调整才保证了程序的正常运行。
为了方便了解系统的操作过程,特画出改程序的系统流程图。
动画心的主程序流程图见图1。
3.2图形显示设计
由程序要实现的显示效果可见,程序中要引入多种图案,具体由方框、对角线、任意水平垂直线、“心”等来形成整个图案。
所以要在程序中出现多次各种图案来填充整个图形。
(1)画方框
进入显示动画心的界面时,首先出现的是方框。
采用了mov,sub,inc,cmp,jnz等指令进行了定义,来显示出方框的逐步显示。
先是设置cx,dx,bx各个寄存器不同的初值,即设置像素点的颜色、坐标和个数,接着由大到小画方框,每画一个方框之前,各个寄存器都要设置不同的初值。
(2)画对角线
和画方框差不多,每画一条对角线之前各个寄存器也要设置不同的初值。
(3)画任意水平垂直线
画十字线之前,各个寄存器如cx,bx,dx也需要设定不同的初值。
(4)由大到小画方框
由程序要显示的效果来分析,还需要再一次引入大大小小的方框,故还需要再一次由大到小画方框。
(5)填充
辅助图形画好以后,需要采用行、列坐标连续写像素的方法来填充图形,达到统一合成的效果。
(6)画心
由程序显示的效果来看,最关键的就是画心这个主要的图形了。
4.子程序的设计
4.1延时子程序
先pushcx,dx,即先让cx,dx进栈,接着设置dx寄存器的初值为25,利用其12号功能设置cx的初值为2801,利用其13号功能使之循环。
在进行循环次数计数(即dx→dx-1)后,判断循环是否结束:
如(dx)≠0,继续循环,转移到目标地址d12所在的指令,否则顺序执行。
然后dx,cx顺序出栈。
最后返回。
在编写延时子程序时,由于我没有压栈dx和cx,没有把外循环和内循环设置好,在运行程序时出现了错误,后来我对dx和cx进行压栈,把循环次数和循环语句设置好了,才把延时子程序编写好。
为了更好的了解延时子程序,我画了延时子程序的流程图见图2。
图2延时子程序流程图
4.2清屏子程序
先设置功能号al及寄存器bx,cx,dx的初值,接着进入line循环程序。
在line循环程序中,先清除缓冲区并请求指定的输入功能,接着利用BIOS功能调用的10H中断类型实现显示器输出控制。
在进行循环次数计数(即cx→cx+1)后,判断循环是否结束:
如(cx)≠320,则继续循环,转移到目标地址line所在的指令,否则再设置寄存器cx的初值,在进行循环次数计数(dx←dx+1)后,判断循环是否结束:
如(dx)≠200,则继续循环,转移到目标地址line所在的指令,否则顺序执行。
最后返回。
在编写清屏子程序时遇到的最大困难就是编写line循环程序了,我没有把该循环程序的循环次数设置正确,后来经过一点点的改正才编写正确,(cx)≠320继续循环,转移到目标地址line所在的指令,否则再设置寄存器cx的初值,在进行循环次数计数(dx←dx+1)后,判断循环是否结束。
为了更好的了解清屏子程序,我画了该程序的流程图见图3。
图3清屏子程序流程图
三、软件设计
主程序:
datasegment
buff1db'
db'
db'
buff2db'
db'
dataends
stacksegmentstack
stackends
codesegment
mainprocfar
assumecs:
code,ds:
data
start:
pushds
subax,ax
pushax
movax,data
movds,ax
movah,00
moval,04
int10h
movah,0bh
movbh,00
movbl,1
int10h
movah,0bh
movbh,1
movbl,2
int10h
movdx,offsetbuff1
movah,09
int21h
movah,08
int21h
callclear
sss:
calltext
movdi,2
moval,1
movcx,70
movdx,20
movbx,160
callbox
movcx,71
movdx,21
movbx,158
again:
moval,1
movdi,0
callbox
calldelay
moval,0
movdi,0
callbox
inccx
incdx
subbx,2
cmpcx,94
jnzagain
movdi,0
movcx,95
movdx,45
moval,1
movbx,110
callbox
movcx,96
movdx,46
movbx,108
again_00:
moval,1
movdi,0
callbox
calldelay
calldelay
moval,0
movdi,0
callbox
inccx
incdx
subbx,2
cmpcx,114
jnzagain_00
movcx,115
movdx,65
moval,1
movbx,70
callbox
movcx,116
movdx,66
movbx,68
again_01:
moval,1
movdi,0
callbox
calldelay
calldelay
moval,0
movdi,0
callbox
inccx
incdx
subbx,2
cmpcx,129
jnzagain_01
movdi,2
moval,1
movcx,130
movdx,80
movbx,40
callbox
movdi,2
moval,3
movsi,0
movcx,71
movdx,21
movbx,59
callxie_line
movcx,171
movdx,121
movbx,59
callxie_line
movsi,1
movcx,71
movdx,179
movbx,59
callxie_line
movcx,171
movdx,79
movbx,59
callxie_line
movcx,150
movdx,20
movsi,0
movbx,60
calldraw_line
movcx,150
movdx,120
movbx,60
calldraw_line
movcx,70
movdx,100
movsi,1
movbx,60
calldraw_line
movcx,170
movdx,100
movbx,60
calldraw_line
movcx,149
movdx,120
moval,2
movbx,60
movsi,0
calldraw_line
movsi,1
movcx,70
movdx,60
movbx,60
callmid_line
movcx,170
movdx,110
movbx,60
callmid_line
movsi,2
movcx,110
movdx,20
movbx,30
callmid_line
movcx,160
movdx,120
movbx,30
callmid_line
movsi,3
movcx,70
movdx,140
movbx,60
callmid_line
movcx,170
movdx,90
movbx,60
callmid_line
movsi,4
movcx,110
movdx,180
movbx,30
callmid_line
movcx,160
movdx,80
movbx,30
callmid_line
movcx,149
movdx,120
moval,2
movbx,60
movsi,0
calldraw_line
heart_:
画心主程序
callcls_box
callheart
movah,08
int21h
cmpal,'q'
jzok
cmpal,20h
jzheart_
callclear
jmpsss
ok:
ret
mainendp
codeends
endstart
画斜线子程序:
Mid_lineprocnear
addbx,cx
cmpsi,2
jzmidline_2
cmpsi,3
jzmidline_3
cmpsi,4
jzmidline_4
midline_1:
movah,0ch
int10h
incdx
addcx,2
cmpcx,bx
jnemidline_1
jmpexit_lines
midline_2:
movah,0ch
int10h
adddx,2
inccx
cmpcx,bx
jnemidline_2
jmpexit_lines
midline_3:
movah,0ch
int10h
decdx
addcx,2
cmpcx,bx
jnemidline_3
jmpexit_lines
midline_4:
movah,0ch
int10h
subdx,2
inccx
cmpcx,bx
jnemidline_4
exit_lines:
ret
mid_lineendp
扩展程序:
改动程序使动画方框变化从由大变小改成方框变化由小变大,并同时改变运动轨迹的变化也是由小到大。
以下程序代码只写出需改动的一小段程序,其它不变与原程序相同。
movdi,2
moval,1
movcx,130
movdx,80
movbx,40
callbox
movcx,129
movdx,79
movbx,42
again:
moval,1
movdi,0
callbox
calldelay
moval,0
movdi,0
callbox
deccx
decdx
addbx,2
cmpcx,116
jnzagain
movcx,115
movdx,65
moval,1
movbx,70
callbox
movcx,114
movdx,64
movbx,72
again_01:
moval,1
movdi,0
callbox
calldelay
calldelay
moval,0
movdi,0
callbox
deccx
decdx
addbx,2
cmpcx,96
jnzagain_01
movdi,0
movcx,95
movdx,45
moval,1
movbx,110
callbox
movcx,94
movdx,44
movbx,112
again_00:
moval,1
movdi,0
callbox
calldelay
calldelay
moval,0
movdi,0
callbox
deccx
decdx
addbx,2
cmpcx,71
jnzagain_00
movdi,2
moval,1
movcx,70
movdx,20
movbx,160
callbox
五参考文献
[1]周佩玲、彭虎、傅忠谦,微机原理与接口技术.北京:
电子工业出版社,2005.4
[2]于春凡、朱耀庭,宏汇编语言程序设计.天津:
南开大学出版社,1996.6第一版
[3]马瑞芳,汇编语言程序设计.西安:
西北工业大学出版社,2002.3第一版
[4]齐志儒,高福祥.汇编语言程序设计[M],第4版.沈阳:
东北大学出版社,2008.1
[5]沈美明,温冬婵.IBM-PC汇编语言程序设计[M],第3版.北京:
清华大学出版社,2007.7
[6]李心广,汇编语言与计算机系统组成[M],第1版.北京:
机械工业出版社,2010.1
[7]马瑞芳,汇编语言程序设计[M],第一版.西安:
西北工业大学出版社,2002.3
设计总结:
在做本次课程设计中,我们查了大量的资料。
为了让我们的设计更加完善,我们也遇到了一些问题,在设计一些子程序的时候遇到了一些困难,在编写延时子程序时,由于我没有压栈dx和cx,没有把外循环和内循环设置好,在运行程序时出现了错误,后来我对dx和cx进行压栈,把循环次数和循环语句设置好了,才把延时子程序编写好,在编写清屏子程序时遇到的最大困难就是编写line循环程序了,我没有把该循环程序的循环次数设置正确,后来经过一点点的改正才编写正确,(cx)≠320继续循环,转移到目标地址line所在的指令,否则再设置寄存器cx的初值,在进行循环次数计数(dx←dx+1)后,判断循环是否结束。
同时在编写主程序时也遇到了一些问题,我们在运行时发现了错误,后来发现在调用dos的08号功能时时出现了错误,通过查看资料发现在调用dos的08号功能时应该在AL中存放输入字符的ASCII码,而我们直接输入的字符。
在画方框、对角线、任意水平线时先是设置cx,bx,dx各个寄存器赋予不同的初值,但我们在开始的时候没有把初值设置好,结果造成了程序的出错,后来经过调整才保证了程序的正常运行。
经过一周时间的实训,不仅让我把所学的理论知识与实践相结合起来,也提高了我们的实际动手能力和独立思考能力,虽然我们花了许多时间,但我相信我们得到的也会很多。
指导教师评语:
课程设计成绩:
指导教师签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动画 课程设计