动画心课程设计.docx

上传人:b****8 文档编号:30287848 上传时间:2023-08-13 格式:DOCX 页数:20 大小:91.69KB
下载 相关 举报
动画心课程设计.docx_第1页
第1页 / 共20页
动画心课程设计.docx_第2页
第2页 / 共20页
动画心课程设计.docx_第3页
第3页 / 共20页
动画心课程设计.docx_第4页
第4页 / 共20页
动画心课程设计.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

动画心课程设计.docx

《动画心课程设计.docx》由会员分享,可在线阅读,更多相关《动画心课程设计.docx(20页珍藏版)》请在冰豆网上搜索。

动画心课程设计.docx

动画心课程设计

 

郑州航空工业管理学院

微机原理课程设计说明书

 

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各个寄存器赋予不同的初值,但我们在开始的时候没有把初值设置好,结果造成了程序的出错,后来经过调整才保证了程序的正常运行。

经过一周时间的实训,不仅让我把所学的理论知识与实践相结合起来,也提高了我们的实际动手能力和独立思考能力,虽然我们花了许多时间,但我相信我们得到的也会很多。

指导教师评语:

 

课程设计成绩:

指导教师签名:

年月日

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

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1