汇编语言编写动画心的详细报告.docx

上传人:b****5 文档编号:12537315 上传时间:2023-04-20 格式:DOCX 页数:33 大小:619.07KB
下载 相关 举报
汇编语言编写动画心的详细报告.docx_第1页
第1页 / 共33页
汇编语言编写动画心的详细报告.docx_第2页
第2页 / 共33页
汇编语言编写动画心的详细报告.docx_第3页
第3页 / 共33页
汇编语言编写动画心的详细报告.docx_第4页
第4页 / 共33页
汇编语言编写动画心的详细报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

汇编语言编写动画心的详细报告.docx

《汇编语言编写动画心的详细报告.docx》由会员分享,可在线阅读,更多相关《汇编语言编写动画心的详细报告.docx(33页珍藏版)》请在冰豆网上搜索。

汇编语言编写动画心的详细报告.docx

汇编语言编写动画心的详细报告

课程设计说明书NO.

一、课程设计的目的及内容

汇编语言与计算机系统组成是一项实用性很强的技术,只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。

通过设计开发汇编软件,不仅可以加深学生对汇编程序基本概念的了解,巩固学习成果;还能够提高实际动手能力及对计算机硬件的了解,掌握计算机软件与硬件之间的联系。

为学生后续课程的学习,打下良好的基础。

同时汇编课程设计也是计算机科学与技术专业的基础选修课的实践环节。

本课程设计的主要目的是掌握汇编程序设计的基本方法,并掌握程序设计中常见的错误的排除和避免。

提供一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力,从而进一步提高了实际运用的能力。

二、开发坏境

1.硬件环境

普通pc机

2.软件环境

(1)使用编辑软件TE.EXE进行源程序的编写。

(2)使用汇编软件MASM.EXE对源程序汇编。

(3)使用连接软件LINK.EXE对目标文件进行连接。

(4)使用调试软件DEBUG.EXE对可执行程序进行调试。

(5)DOS系统

三、功能分析

1.需求分析

1.1.设计内容

设计一彩色动画的程序,一个颜色方框从四周向中间由大变小,并留下痕迹,中心位置出现一颗红“心”。

1.2.设计要求

(1)按任意键进入图形显示;

(2)按空格键重复出现“心”;

(3)按回车键将重复整个图形;

(4)q键退出程序。

1.3.设计思路

本程序主要是利用BIOS功能调用的10H中断类型实现的。

利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画斜线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。

画完图形之后延时,清屏。

同时,利用dos功能调用的08号功能,从键盘输入字符。

如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变“心”的大小;如果是“q”键,则退出。

该系统只是简单的运用字符进行设计组成相应的图像,运用masm编程工具、link连接程序在debug环境下进行调试而成。

在系统中界面中,首先是按下任意键进入动画心界面。

然后会按Q键退出的提示信息,其中包含2个隐藏信息:

按空格键刷新心型图案,来实现动态心;按其余键是重复动画心的显示。

其中主要运用的指令有:

push(压入堆栈);Pop(从堆栈中释放首地址的内容);sub(减法指令);add(加法指令);mov(传送指令);call(过程调用指令);lea(地址传送指令);inc(加一指令);cmp(比较指令);jmp(跳转指令);jnz(条件跳转指令)。

2.详细设计

2.1主程序设计

先设置图形显示方式为320*200彩色图形方式、背景色为蓝色和设置彩色组,再利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画斜线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。

画完图形之后延时,清屏。

同时,利用dos功能调用的08号功能,从键盘输入字符。

如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变“心”的大小;如果是“q”键,则退出。

在编写主程序时遇到了一些问题,我们在运行时发现了错误,后来发现在调用dos的08号功能时时出现了错误,通过查看资料发现在调用dos的08号功能时应该在AL中存放输入字符的ASCII码,而我们直接输入的字符。

在画方框、对角线、任意水平线时先是设置cx,bx,dx各个寄存器赋予不同的初值,但我们在开始的时候没有把初值设置好,结果造成了程序的出错,后来经过调整才保证了程序的正常运行。

为了方便了解系统的操作过程,特画出改程序的系统流程图。

动画心的主程序流程图见图1。

 

图1动画心的主程序流程图

2.2图形显示设计

由程序要实现的显示效果可见,程序中要引入多种图案,具体由方框、对角线、任意水平垂直线、“心”等来形成整个图案。

所以要在程序中出现多次各种图案来填充整个图形。

(1)画方框

进入显示动画心的界面时,首先出现的是方框。

采用了mov,sub,inc,cmp,jnz等指令进行了定义,来显示出方框的逐步显示。

先是设置cx,dx,bx各个寄存器不同的初值,即设置像素点的颜色、坐标和个数,接着由大到小画方框,每画一个方框之前,各个寄存器都要设置不同的初值。

(2)画对角线

和画方框差不多,每画一条对角线之前各个寄存器也要设置不同的初值。

(3)画任意水平垂直线

画十字线之前,各个寄存器如cx,bx,dx也需要设定不同的初值。

(4)由大到小画方框

由程序要显示的效果来分析,还需要再一次引入大大小小的方框,故还需要再一次由大到小画方框。

(5)填充

辅助图形画好以后,需要采用行、列坐标连续写像素的方法来填充图形,达到统一合成的效果。

(6)画心

由程序显示的效果来看,最关键的就是画心这个主要的图形了。

3.子程序的设计

3.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延时子程序流程图

3.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清平子程序流程图

四、调试与运行

4.1调试

(1)调用debugxin.exe命令,然后出现一短横,在短横后输入u命令,将内存中的内容转换为汇编语句,然后再语句中寻找断点,我找的是本程序的清平子程序的汇编语句,然后g命令执行清屏子程序的偏移地址05AB到05CC,执行结果见图4。

图4断点设置结果图

(2)调用debugxin.exe命令,然后出现一短横,在短横后输入u命令,将内存中的内容转换为汇编语句,然后再语句中寻找断点,我找的是本程序的画心形的汇编语句,然后g命令执行清屏子程序的偏移地址03F4到059B,执行结果见图5。

图5断点设置结果

4.2运行结果

用编辑器输入编好的程序源代码转换成目标文件,再将目标文件连接生成可执行文件并运行该程序,得出程序运行结果。

动画心画图程序运行的开始界面见图6

 

图6开始界面

运行编好后的程序,屏幕背景色为蓝色,先显示“Welcomeyoutorunthisprogram!

”“*****pleasepressanykey*****”的提示信息;按任意键后,出现“Myheartbestswithyours!

”“*****pleasepressqtoquit*****”的文本信息;然后出现方框连续的由大变小,并留下痕迹,再出现一个心;按空格键重复出现心,任意键重复整个动画,其完整动画心图见图7。

图7完整动画心图

五、总结

在做本次课程设计中,我们查了大量的资料。

为了让我们的设计更加完善,我们也遇到了一些问题,在设计一些子程序的时候遇到了一些困难,在编写延时子程序时,由于我没有压栈dx和cx,没有把外循环和内循环设置好,在运行程序时出现了错误,后来我对dx和cx进行压栈,把循环次数和循环语句设置好了,才把延时子程序编写好,在编写清屏子程序时遇到的最大困难就是编写line循环程序了,我没有把该循环程序的循环次数设置正确,后来经过一点点的改正才编写正确,(cx)≠320继续循环,转移到目标地址line所在的指令,否则再设置寄存器cx的初值,在进行循环次数计数(dx←dx+1)后,判断循环是否结束。

同时在编写主程序时也遇到了一些问题,我们在运行时发现了错误,后来发现在调用dos的08号功能时时出现了错误,通过查看资料发现在调用dos的08号功能时应该在AL中存放输入字符的ASCII码,而我们直接输入的字符。

在画方框、对角线、任意水平线时先是设置cx,bx,dx各个寄存器赋予不同的初值,但我们在开始的时候没有把初值设置好,结果造成了程序的出错,后来经过调整才保证了程序的正常运行。

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

六、参考文献

[1]齐志儒,高福祥.汇编语言程序设计[M],第4版.沈阳:

东北大学出版社,2008.1

[2]沈美明,温冬婵.IBM-PC汇编语言程序设计[M],第3版.北京:

清华大学出版社,2007.7

[3]李心广,汇编语言与计算机系统组成[M],第1版.北京:

机械工业出版社,2010.1

[4]马瑞芳,汇编语言程序设计[M],第一版.西安:

西北工业大学出版社,2002.3

[5]郑初华,汇编语言、微机原理及接口技术[M],第三版.北京:

电子工业出版社出版社,2010.6

 

七、源程序代码

datasegment

fulldb0

buff1db'Welcomeyoutorunthisprogramme!

'

db''

db'*****Pleasepressanykey*****$'

buff2db'Myheartbeatswithyours!

'

db'*****Pleaseqtoquit*****$'

dataends

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;cls

sss:

calltext;displaythetext

movdi,2

moval,1;drawthebigbox

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;drawthe2ndbox

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;drawthe3rdbox

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;drawthesmallbox

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

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

movdi,0

moval,1;drawthebigboxagain

movcx,70

movdx,20

movbx,160

callbox

movdi,0

moval,1;drawthesmallboxagain

movcx,130

movdx,80

movbx,40

callbox

movdi,0

movcx,95

movdx,45

moval,1

movbx,110

callbox

movcx,115

movdx,65

moval,1

movbx,70

callbox

movdi,1;fill

callfill

callfill_2

callfill_3

movcx,149;bold

movdx,120

moval,2

movbx,60

movsi,0

calldraw_line

movcx,151

movdx,120

moval,2

movbx,60

movsi,0

calldraw_line

heart_:

;drawtheheart

callcls_box

callheart

movah,08

int21h

cmpal,'q'

jzok

cmpal,20h

jzheart_

callclear

jmpsss

ok:

ret

mainendp

fillprocnear;theprocedureoffill

movfull,0

moval,5

movcx,160

movdx,121

movsi,0

movbx,60

fill_Y:

pushcx

pushdx

pushbx

calldraw_line

popbx

popdx

popcx

subbx,2

inccx

adddx,2

incfull

cmpfull,30

jnefill_y

ret

fillendp

fill_2procnear

movfull,0

moval,5

movcx,140

movdx,121

movsi,0

movbx,60

fill_Y1:

pushcx

pushdx

pushbx

calldraw_line

popbx

popdx

popcx

subbx,2

deccx

adddx,2

incfull

cmpfull,30

jnefill_y1

ret

fill_2endp

fill_3procnear

moval,1

movfull,0

movsi,0

movcx,140

movdx,121

movbx,60

re_fill:

pushbx

pushcx

pushdx

calldraw_line

popdx

popcx

popbx

inccx

incfull

cmpfull,9

jnere_fill

movfull,0

movcx,159

movdx,121

movbx,60

re_fill2:

pushbx

pushcx

pushdx

calldraw_line

popdx

popcx

popbx

deccx

incfull

cmpfull,9

jnere_fill2

ret

fill_3endp

draw_Lineprocnear;theprocedureofdrawaline

pushbx

cmpsi,0

jzV_line1

addbx,cx

H_line:

movah,0ch

int10h

cmpdi,0

jzaa0

cmpdi,1

jzaa1

calldelay

aa1:

calldelay

aa0:

inccx

cmpcx,bx

jneH_line

jmpexit_line

V_line1:

addbx,dx

V_line:

movah,0ch

cmpdi,0

jzbb0

cmpdi,1

jzbb1

calldelay

bb1:

calldelay

bb0:

int10h

incdx

cmpdx,bx

jneV_line

exit_line:

popbx

ret

draw_Lineendp

xie_lineprocnear;theprocedureofdrawaxie_line

addbx,cx

cmpsi,1

jzxieline_1

xieline_0:

movah,0ch

int10h

incdx

inccx

cmpcx,bx

jnexieline_0

jmpexit_xie

xieline_1:

movah,0ch

int10h

decdx

inccx

cmpcx,bx

jnexieline_1

exit_xie:

ret

xie_lineendp

Mid_lineprocnear;drawaxie_line

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

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

当前位置:首页 > 经管营销 > 人力资源管理

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

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