基于汇编语言实现的动画心程序

邱丑丑

发布日期: 2019-05-23 18:52:16 浏览量: 504
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

一、软件背景介绍

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

  • 按任意键进入图形显示

  • 按空格键重复出现“心”

  • 按回车键将重复整个图形

  • 按q键退出程序

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

要显示出方框由大变小的效果程序采用绘制方框,再清除此方框,再显示更小一个方框的方法来实现。而方框本身和红心的绘制可采用字符拼凑和直接用图形模式制作。按q键退出的功能可以采用在动画执行完成后调用键盘输入中断,再判断输入的是否为q键,如果是则退出,不是则继续等待键盘输入。

程序的运行过程:

如图1所示,开始画面:

如图2所示,按任意键,进入图形显示;按回车键,重新显示这个图形;绘制各个方格,进行下方颜色填充;按q键,则退出。

本程序主要是利用BIOS功能调用的10H中断类型实现的。利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画斜线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。画完图形之后延时,清屏。同时,利用dos功能调用的08号功能,从键盘输入字符。如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变“心”的大小;如果是“q”键,则退出。

该系统只是简单的运用字符进行设计组成相应的图像,运用masm编程工具、link连接程序在debug环境下进行调试而成。在系统中界面中,首先是按下任意键进入动画心界面。然后会按Q键退出的提示信息,其中包含2个隐藏信息:按空格键刷新心型图案,来实现动态心;按其余键是重复动画心的显示。

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

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

本程序运行后的功能有:

  • 程序运行时显示提示信息,并提示按任意键进入动画心界面

  • 让一个方框向中间由大变小,并留下痕迹,然后出现一个心

  • 按空格键开始刷新心形图案

  • 按其他键首先清除图像,然后重复动画

  • 按Q键退出程序。

二、核心算法思想

本程序主要的模块有三个:第一是图形显示模块,构建基础的图形界面;第二是主程序,核心算法包括画方框子程序、画对角线子程序、画任意水平垂直线子程序、由大到小画方框子程序,填充子程序、画心子程序等;第三则是时间与界面控制程序,包括延迟子程序,清屏子程序。

此处着重论述部分算法:

画方框

进入显示动画心的界面时,首先出现的是方框。采用了mov,sub,inc,cmp,jnz等指令进行了定义,来显示出方框的逐步显示。先是设置cx,dx,bx各个寄存器不同的初值,即设置像素点的颜色、坐标和个数,接着由大到小画方框,每画一个方框之前,各个寄存器都要设置不同的初值。

画对角线

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

画任意水平垂直线

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

主程序设计

先设置图形显示方式为320*200彩色图形方式、背景色为蓝色和设置彩色组,再利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画斜线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。画完图形之后延时,清屏。同时,利用dos功能调用的08号功能,从键盘输入字符。如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变“心”的大小;如果是“q”键,则退出。

延时子程序

先push cx,dx,即先让cx,dx进栈,接着设置dx寄存器的初值为25,利用其12号功能设置cx的初值为2801,利用其13号功能使之循环。在进行循环次数计数(即dx→dx-1)后,判断循环是否结束:如(dx)≠0,继续循环,转移到目标地址d12所在的指令,否则顺序执行。然后dx,cx顺序出栈。最后返回。

清屏子程序

先设置功能号al及寄存器bx,cx,dx的初值,接着进入line循环程序。在line循环程序中,先清除缓冲区并请求指定的输入功能,接着利用BIOS功能调用的10H中断类型实现显示器输出控制。在进行循环次数计数(即cx→cx+1)后,判断循环是否结束:如(cx)≠320,则继续循环,转移到目标地址line所在的指令,否则再设置寄存器cx的初值,在进行循环次数计数(dx←dx+1)后,判断循环是否结束:如(dx)≠200,则继续循环,转移到目标地址line所在的指令,否则顺序执行。最后返回。

三、核心算法流程图

先设置图形显示方式为320*200彩色图形方式,背景为蓝色和设置彩色数组,在利用其12号功能,设置像素点的颜色,坐标和个数,从而画出图形需要的线段,如画方框,画斜线,画水平垂直线,以及采用行,列坐标连续写像素的方法填充图形等。画完图形之后延时,清屏。同时,利用dos功能调用08号功能,从键盘输入字符,如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变心大小;如果是q键,则退出。以下是程序的核心算法流程图。

主程序流程图

程序流程图

四、开发中遇到的问题

在编写主程序时遇到了一些问题,我们在运行时发现了错误,后来发现在调用dos的08号功能时应该在AL中存放输入字符的ASCII码,而我们直接输入的字符。在画方框、对角线、任意水平线时先是设置cx,bx,dx各个寄存器赋予不同的初值,但我们在开始的时候没有把初值设置好,结果造成了程序的出错,后来经过调整才保证了程序的正常运行。

然后最为重要的问题是,我们的函数执行顺序遇到了问题。期初,我们想的是先打印三个方框的同时进行画斜线的子程序,但这样的问题在于他们之间的执行顺序会在退出主程序造成麻烦,平添了许多代码,同时造成了资源浪费的问题。之后我们尝试着以更简单的思路线性执行子函数,并且构建了延迟子函数,以保证打印出效果很好,画面看起来也更加完善一些。

延时子程序应该先push cx,dx,即先让cx,dx进栈,接着设置dx寄存器的初值为25,利用其12号功能设置cx的初值为2801,利用其13号功能使之循环。在进行循环次数计数(即dx→dx-1)后,判断循环是否结束:如(dx)≠0,继续循环,转移到目标地址d12所在的指令,否则顺序执行。然后dx,cx顺序出栈。最后返回。

但我们在在编写延时子程序时,由于我没有压栈dx和cx,没有把外循环和内循环设置好,在运行程序时出现了错误。后来我对dx和cx进行压栈,把循环次数和循环语句设置好了,才把延时子程序编写好。

进行清屏子程序时先设置功能号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)后,判断循环是否结束。

最后进行调试的时候,代码的错误比我们想像的要多很多,而且犯了很多不该犯的错误,比如打错操作符等低级问题,这给我们敲响了警钟,做事确实要更认真才行。但有些BUG确实是难以寻找,绘制出来的图画完全不对,其中就有一段是该将cx寄存器的值给bx,但由于失误而写反了,这个问题我们找了很久才找到,确实让我们印象深刻。

找到问题,修改问题,有时候确实要比写代码都复杂,细心真的很重要。最后的调试阶段中,很多错误我们都是闻所未闻的,百度了很多相关知识才能去修复一个错误,比如远程调用和近程调用就要加以区分。

五、心得体会

这次实训通过老师给的一些建议,经过自己的改写,实现要求。先做简单的输出,一步步的再做其它图案,在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。在具体操作中对这学期所学的汇编语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之处,在以后的上机中应更加注意,同时体会到在整个程序的编写中,调试占了很大部分的时间。

通过上机我发现上机实训更为重要,特别是要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟悉的掌握debug命令,这对程序的调试是非常重要的。

通过实际操作,学会了汇编语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”,“不耻下问”等的寓意。

上传的附件 cloud_download 汇编文档3.1.doc ( 467.97kb, 5次下载 ) cloud_download 汇编动画心源码.txt ( 22.88kb, 4次下载 )
error_outline 下载需要3点积分

发送私信

精品资源尽在此

49
文章数
0
评论数
最近文章
eject