汇编语言编写动画心的详细报告.docx
《汇编语言编写动画心的详细报告.docx》由会员分享,可在线阅读,更多相关《汇编语言编写动画心的详细报告.docx(33页珍藏版)》请在冰豆网上搜索。
汇编语言编写动画心的详细报告
课程设计说明书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