资源描述
攀枝花学院
学生课程设计(论文)
题 目: 动画“心”程序设计
学生姓名: 周 显 国 学 号: 200910804051
所在院(系): 计算机学院
专 业: 软件工程
班 级: 第二组
指 导 教 师: 何老师 职称: 讲师
2010年 12月 31日
攀枝花学院教务处制
攀枝花学院本科学生课程设计任务书
题 目
动画“心”程序设计
1、课程设计的目的
(1)提高学生综合运用汇编语言课程的理论知分析问题、解决问题的能力。
(2)通过查找、运用设计资料,完成工程设计所必备的基本训练。
(3)让同学们更深入的了解计算机系统内部的有关知识,培养学生理论联系实际的设计思想,为以后的学习和系统开发奠定良好的基础。
2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)
设计内容:设计一彩色动画的程序,一个颜色方框从四周向中间由大变小,并留下痕迹,中心位置出现一颗红“心”。 设计要求:
(1) 按任意键进入图形显示;
(2) 按空格键重复出现“心”;
(3) 按回车键将重复整个图形;
(4) 按q键退出程序。
设计思路:本程序主要是利用BIOS功能调用的10H中断类型实现的。利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画斜线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。画完图形之后延时,清屏。同时,利用dos功能调用的08号功能,从键盘输入字符。如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变“心”的大小;如果是“q”键,则退出。
3、主要参考文献
【1】《汇编语言第2版》王爽老师 清华大学出版社
【2】《IBM-PC汇编语言及程序设计实验教程》,沈美明等,清华大学出版社 ,2001
【3】《汇编语言程序设计》, 张志明等,重庆大学出版社,1997
【4】《汇编语言程序设计》, 钱晓捷等,电子工业出版社,2000
【5】《汇编语言程序设计》,吴向军等,高等教育出版社,2002
4、课程设计工作进度计划
时间(天) 内容安排
周一……周二 分析设计准备
周三……周四 编程调试阶段
周五 编写课程设计报告
指导教师(签字)
日期
年 月 日
教研室意见:
年 月 日
学生(签字):
接受任务时间: 年 月 日
课程设计(论文)指导教师成绩评定表
题目名称
评分项目
分值
得分
评价内涵
工作
表现
20%
01
学习态度
6
遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。
02
科学实践、调研
7
通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。
03
课题工作量
7
按期圆满完成规定的任务,工作量饱满。
能力
水平
35%
04
综合运用知识的能力
10
能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。
05
应用文献的能力
5
能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。
06
设计(实验)能力,方案的设计能力
5
能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。
07
计算及计算机应用能力
5
具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。
08
对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)
10
具有较强的数据收集、分析、处理、综合的能力。
成果
质量
45%
09
插图(或图纸)质量、篇幅、设计(论文)规范化程度
5
符合本专业相关规范或规定要求;规范化符合本文件第五条要求。
10
设计说明书(论文)质量
30
综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。
11
创新
10
对前人工作有改进或突破,或有独特见解。
成绩
指导教师评语
指导教师签名: 年 月 日
摘 要
此次微机原理课程说明书根据设计任务阐述动画心汇编程序的设计基本思想与方案,绘制程序流程图,运用8086CPU提供的指令、伪指令、宏指令及DOS,BIOS功能调用编写程序源代码,同时给出说明注释。并利用计算机提供的软件调试工具对所编写程序进行调试,记录下整个调试分析的过程与运行结果。介绍了汇编语言程序的编辑以及编译,对于动画“心”程序设计思想和设计流程也做出了全面的叙述,在了解数据库的基础上对其做到了一定的运用,并且做出了动画“心”程序各个功能的实现过程以及详细设计过程,在绘制简单系统的流程图的同时,力求更加清晰地表明设计思想以及对整个程序设计的规划及具体实现。根据实际要求,以及汇编语言程序的设计思想,在Windows XP操作系统环境下,搭建masm运行环境,通过对汇编语言中的用16/32位Intel CPU为介绍对象的这两类CPU的指令系统的运用,以及常用的编程环境和调试工具的使用。
关键词:动画心、汇编语言、方案、程序原代码、调试。
1 课程设计题目描述和要求
1.1 问题提出及功能要求
本课程设计要求编写一个完整的程序以实现一个小动画。该动画要求先显示一些提示信息,然后按任意键进入,只见一个方框向中间由大变小,并留下痕迹,然后出现一个心,按空格重复出现心,按其他键将重复,按Q键退出程序。
1.2 运行环境
微软的服务器操作系统windows2003 应用软件MASM5.0
1.3 本课题涉及的主要知识点
1 BIOS功能调用
2中断类型实现
3 08号功能和12号功能
4设置像素的颜色、坐标和个数
5 DOS系统功能调用
6采用行、列坐标连续写像素的方法填充图形
7 汇编语言的基本常用指令
8 多重循环的算法设计
2、算法设计
2.1设计思路
本程序主要是利用BIOS功能调用的10H中断类型实现的。利用其12号功能,设置像素的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画对角线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。画完图形之后延时,清屏。同时,利用DOS系统功能调用的08号功能,从键盘输入字符。如果是任意键,则进入图形显示;如果是空格键,则改变“心”的大小;如果是其它键,则重新显示整个图形;如果是“q”键,则退出。
2.2设计方案与扩展
2.2.1方案
由基本设计思路拟订出原方案。先分别编写画方框、画对角线、画水平垂直线,画斜线,画心型;以及清屏、清除心型、延时和显示文本信息的子程序。然后,通过编写主程序调用这些子程序来实现设计的要求。
2.2.2扩展
扩展一:通过改变BIOS功能调用的10H中断类型的11号功能(BL)的赋值来改变图形与线条以及背景的颜色。
扩展二:将原设计任务要求的方框由大变小改成方框由小变大。同时,也可改变方框变化划过的轨迹变化,使其不在是从大框一直到小框,而是从小框到大框;使改变后的方框变化看上去是移动的不断从小到大变化。
扩展三:为了使运行的动画人眼看上去是连续移动的,我们可以根据人眼的反应时间来设置延时程序。通过计算得出延时程序所需的循环的次数,以达到以上目的。计算式为:(人眼的反应时间:响应时间如果超过40毫秒,人眼就会出现运动图像的迟滞现象。)
以上扩展方案会在程序源代码中具体说明。
2.3动画心程序流程图
由设计方案画出动画心程序流程图如图2.1所示:开始
设置显示方式
设置背景色,彩色调板
显示提示信息
从键盘输入任意字符
清屏
从大到小画方框
延时
画十字线
画任意水平垂直线
填充
画“心”
延时
从键盘输入字符
Yes
No
Yes
No
Yes
结束
No
图2.1动画心程序结构流程图
(al)=任意键?
(al)=空格?
(al)=q?
清除心/重复出现心
3、代码设计
3.1代码与画斜线子程序源代码
主程序:
data segment
buff1 db ' Welcome you to run this program!'
db ' '
db ' *****Please press any key *****$'
buff2 db ' My heart beats with yours!'
db ' ***** Please press q to quit *****$'
data ends
stack segment stack ;定义堆栈段
stack ends
code segment
main proc far
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov ah,00 ;设置显示方式为320*200彩色图形方式
mov al,04
int 10h
mov ah,0bh ;利用BIOS调用的10H中断类型11号功能设定背景色
mov bh,00
mov bl,1 ;通过(bl)的赋值0-15设定颜色,此为蓝色
int 10h
mov ah,0bh ;设置彩色组
mov bh,1
mov bl,2
int 10h
mov dx,offset buff1 ;显示提示信息,即buff1的字符串内容
mov ah,09
int 21h
mov ah,08 ;从键盘输入1个字符,但不送显示器显示
int 21h
call clear ;调用清屏子程序
sss:
call text ;显示文本信息
mov di,2 ;开始画大方框
mov al,1
mov cx,70 ;显示点所在列号
mov dx,20 ;显示点所在行号
mov bx,160 ;确定方框大小
call box ;调用画方框子程序
mov cx,71 ;画方框移动轨迹,使方框变化看上去是移动的
mov dx,21
mov bx,158
again: ;由大到小画轨迹方框
mov al,1
mov di,0
call box
call delay
mov al,0
mov di,0
call box
inc cx ;每次轨迹图的行号和列号是自加1,轨迹图是由大变小
inc dx
sub bx,2 ;设定每次轨迹图大小减小的程度
cmp cx,94 ;当轨迹方框大小与下一个方框相等时,退出画轨迹
jnz again
mov di,0 ;画第二个方框,具体画法与画大方框相同
mov cx,95
mov dx,45
mov al,1
mov bx,110 ;第二个方框较第一个方框较小
call box
mov cx,96
mov dx,46
mov bx,108
again_00:
mov al,1
mov di,0
call box
call delay
call delay
mov al,0
mov di,0
call box
inc cx
inc dx
sub bx,2
cmp cx,114
jnz again_00
mov cx,115 ;画第三个方框
mov dx,65
mov al,1
mov bx,70 ;第三个方框较前两个小
call box
mov cx,116
mov dx,66
mov bx,68
again_01:
mov al,1
mov di,0
call box
call delay
call delay
mov al,0
mov di,0
call box
inc cx
inc dx
sub bx,2
cmp cx,129
jnz again_01
mov di,2 ;画最小的方框,此时不需要画轨迹图
mov al,1
mov cx,130
mov dx,80
mov bx,40
call box
mov di,2 ;画对角线
mov al,3
mov si,0
mov cx,71 ;确定点所在列号
mov dx,21 ;确定点所在行号
mov bx,59 ;设置对角线长度
call xie_line ;调用画对角线子程序
mov cx,171
mov dx,121
mov bx,59
call xie_line
mov si,1
mov cx,71
mov dx,179
mov bx,59
call xie_line
mov cx,171
mov dx,79
mov bx,59
call xie_line
mov cx,150 ;画十字线,确定点所在列号
mov dx,20 ;确定点所在行号
mov si,0
mov bx,60 ;确定十字线长度
call draw_line ;调用画线子程序
mov cx,150
mov dx,120
mov bx,60
call draw_line
mov cx,70
mov dx,100
mov si,1
mov bx,60
call draw_line
mov cx,170
mov dx,100
mov bx,60
call draw_line
mov cx,149
mov dx,120
mov al,2
mov bx,60
mov si,0
call draw_line
mov si,1 ;画斜线
mov cx,70
mov dx,60
mov bx,60
call mid_line ;调用画斜线子程序
mov cx,170 ;确定显示点所在列号
mov dx,110 ;确定显示点所在行号
mov bx,60 ;设置斜线长度
call mid_line
mov si,2
mov cx,110
mov dx,20
mov bx,30
call mid_line
mov cx,160
mov dx,120
mov bx,30
call mid_line
mov si,3
mov cx,70
mov dx,140
mov bx,60
call mid_line
mov cx,170
mov dx,90
mov bx,60
call mid_line
mov si,4
mov cx,110
mov dx,180
mov bx,30
call mid_line
mov cx,160
mov dx,80
mov bx,30
call mid_line
mov cx,149
mov dx,120
mov al,2
mov bx,60
mov si,0
call draw_line
heart_: ;画心
call cls_box ;清除最小方框内的内容/清除心
call heart ;调用画心子程序
mov ah,08 ;从键盘输入一个字符,但不送显示器显示
int 21h
cmp al,'q' ;(al)=’q’时,执行ok的内容,即退出
jz ok
cmp al,20h ;(al)=空格时,转去执行heart_的内容,即清除心并重新画心
jz heart_
call clear ;(al)=其他键,则调用清屏子程序清屏
jmp sss ;清屏后转去执行sss的内容,即动画重复
ok: ;退出分支程序
ret
main endp ;主程序结束
code ends
end start
画斜线子程序:
Mid_line proc near
add bx,cx
cmp si,2 ;比较si=2时,转去执行midline_2的内容
jz midline_2
cmp si,3 ;比较si=3时,转去执行midline_3的内容
jz midline_3
cmp si,4 ;比较si=4时,转去执行midline_4的内容
jz midline_4
midline_1: ;画角度大于,且斜率较小的斜线
mov ah,0ch ;BIOS调用10H中断类型12号功能写点及着色
int 10h
inc dx ;每次行坐标加1
add cx,2 ;每次列坐标加2
cmp cx,bx ;比较cx与bx,相当与确定斜线的长度
jne midline_1 ;时继续画斜线
jmp exit_lines
midline_2: ;画角度小于,且斜率较大的斜线
mov ah,0ch
int 10h
add dx,2 ;每次行坐标加2
inc cx ;每次列坐标加1
cmp cx,bx
jne midline_2
jmp exit_lines ;画完斜线退出该子程序
midline_3: ;画角度小于,且斜率较小的斜线
mov ah,0ch
int 10h
dec dx ;每次行坐标减1
add cx,2 ;每次列坐标加2
cmp cx,bx
jne midline_3
jmp exit_lines
midline_4: ;画角度大于,且斜率较大的斜线
mov ah,0ch
int 10h
sub dx,2 ;每次行坐标减2
inc cx ;每次列坐标加1
cmp cx,bx
jne midline_4
exit_lines: ;退出画斜线子程序
ret ;返回主程序,结束中断
mid_line endp ;画斜线子程序结束
扩展程序:改动程序使动画方框变化从由大变小改成方框变化由小变大,并同时改变运动轨迹的变化也是由小到大。以下程序代码只写出需改动的一小段程序,其它不变与原程序相同。
mov di,2 ;先画最小的方框
mov al,1
mov cx,130 ;显示点所在列号
mov dx,80 ;显示点所在行号
mov bx,40 ;设定方框大小
call box ;调用画方框子程序
mov cx,129
mov dx,79
mov bx,42
again: ;画方框由小变大的轨迹
mov al,1
mov di,0
call box
call delay
mov al,0
mov di,0
call box
dec cx ;显示点列号减1
dec dx ;显示点行号减1
add bx,2 ;每个轨迹方框大小减2
cmp cx,116 ;轨迹方框与第三个方框重合时,退出画轨迹
jnz again
mov cx,115 ;画第三个方框
mov dx,65
mov al,1
mov bx,70
call box
mov cx,114
mov dx,64
mov bx,72
again_01:
mov al,1
mov di,0
call box
call delay
call delay
mov al,0
mov di,0
call box
dec cx
dec dx
add bx,2
cmp cx,96
jnz again_01
mov di,0 ;画第二个方框
mov cx,95
mov dx,45
mov al,1
mov bx,110
call box
mov cx,94
mov dx,44
mov bx,112
again_00:
mov al,1
mov di,0
call box
call delay
call delay
mov al,0
mov di,0
call box
dec cx
dec dx
add bx,2
cmp cx,71
jnz again_00
mov di,2 ;画最大的方框,且不用画轨迹
mov al,1
mov cx,70
mov dx,20
mov bx,160
call box
4 调试与运行
4.1 实验步骤
用编辑器输入编好的程序源代码转换成目标文件,再将目标文件连接生成可执行文件并运行该程序
4.2 出现的问题
将目标文件生连接生成可执行文件后,命令提示符显示“ There was 1 error detected.”系统发现存在一个错误,并提示“Warning:No STACK segment.”
没有定义堆栈段,程序可以不定义堆栈段,该错误可以忽略。生成可执行文件的屏幕截图如下图4.1所示:
图4.1 加入堆栈段后生成可执行文件截图
4.3 解决的方法
在源程序中加上如下代码
stack segment stack
stack ends
4.4 使用的实验数据
4.5结果分析
定义堆栈段后错误消失了,如下图4.2所示:
图4.2 加入堆栈段后生成可执行文件截图
最后,运行程序得到我们所想要的结果,完成设计任务。
5 总结
一周的汇编语言课程设计结束了,我的收获很大。通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足。通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握了各个指令的功能,特别是转向指令,掌握了子程序的定义及调用,以及正确地运用DEBUG指令。在整个程序的编写中,调试占了很大部分的时间。要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平。
参 考 文 献
[1]《汇编语言第2版》王爽老师 清华大学出版社
[2]《IBM-PC汇编语言及程序设计实验教程》,沈美明等,清华大学出版社 ,2001
[3]《汇编语言程序设计》, 张志明等,重庆大学出版社,1997
[4]《汇编语言程序设计》, 钱晓捷等,电子工业出版社,2000
[5]《汇编语言程序设计》,吴向军等,高等教育出版社,2002
- 21 -
展开阅读全文