武汉理工大学《微机原理与接口技术》课程设计说明书
摘要
本次课程设计要求用汇编语言编制一个小动画,并且实现一些特定功能。编制动画是程序设计中一种非常有意思且有价值学习的课题。计算机的动画设计是利用计算机图形显示技术来模仿物体活动的效果。在计算机图形设计中,汇编语言具有其独特的特点,因为屏幕上显示一个图像要通过几十个元素完成,处理这些图像元素需要大量的指令。而就速度而言,汇编语言程序远比其他语言程序快得多。
本文是着重通过对动画程序的设计实现汇编语言程序设计。阐述动画汇编程序的设计思路与方案,绘制程序流程图,运用8086CPU提供的指令、伪指令、宏指令及DOS,BIOS功能调用编写程序源代码,同时给出说明注释。并用计算机提供的软件调试工具对所编写程序进行运行调试。
关键字:动画 汇编语言 8086 DOS BOIS
1
武汉理工大学《微机原理与接口技术》课程设计说明书
小动画汇编程序设计
1.课程设计的任务及要求
本次课程设计要求编写一个完整的程序来实现小动画。动画要求先显示一些提示信息,然后按任意键进入,一个距形由大变小,并留下痕迹,最后出现小到一个点,按空格删除痕迹和点,按其他键将重复,按Q键退出程序。
2
武汉理工大学《微机原理与接口技术》课程设计说明书
2.程序的算法设计
2.1设计思路
本程序主要是利用BIOS功能调用的10H中断类型实现的。 利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,以及采用行、列坐标连续写像素的方法填充图形等。画完图形之后延时,清屏。同时,利用DOS系统功能调用的08号功能,从键盘输入字符。如果是任意键,则进入图形显示;如果是回车键,则重新显示整个图形;如果是空格键,删除痕迹和点;如果是“Q”键,则退出。
进行图形的显示设计时,程序中要引入多种图案,具体由方框,对角线,任意水平垂直线,点等来形成整个图案。所以要在程序中多次画各种图案来填充整个图形,同时为了实现程序效果,程序中还调用了不少的子程序,如填充子程序,画线子程序,画十字线子程序,画方框子程序,画点子程序,延时子程序,清屏子程序等。
2.2汇编程序设计过程
汇编语言设计总过程流程图如图2-2所示:
图2-2汇编语言设计总过程流程图
汇编语言程序设计要求综合课上所学的理论知识和汇编语言基础理论,根据设计的要求来充分分析问题,将问题分解成一个一个的简单的环节,以便全面的分析程序来设计汇编语言。设计一个简明、易读、易调试、易维护、执行速度快、占用存储空间尽量少的好程序。
3
武汉理工大学《微机原理与接口技术》课程设计说明书
2.3汇编语言设计中主要指令
在整个程序中,主要运用的指令有:push(压入堆栈);Pop(从堆栈中释放首地址的内容);sub(减法指令);add(加法指令);mov(传送指令);call(过程调用指令);lea(地址传送指令);inc(加一指令);cmp(比较指令);jmp(跳转指令);jnz(条件跳转指令)等。
4
武汉理工大学《微机原理与接口技术》课程设计说明书
3.设计方案及程序流程图
3.1设计功能
程序运行后的功能有:
(1) 程序运行时显示提示信息,按任意键进入动画界面。 (2) 让一个矩形向中心由大变小,并留下痕迹,然后出现一个点。 (3) 按空格键删除痕迹和点。
(4) 按其他键首先清除图像,再重复动画。 (5) 按“Q”键退出程序。
3.2设计方案
由设计思路制定设计方案。先分别编写画矩形、画对角线、画水平垂直线、画斜线、画点、清屏、延时和显示提示信息的子程序。然后,通过编写主程序来调用这些子程序实现课程设计要求。
可以通过改变BIOS功能调用的10H中断类型的11号功能(BL)的赋值来改变图形与线条以及背景的颜色。
为了使运行的动画人眼看上去是连续的,我们可以根据人眼的反应时间来设置延时程序。通过计算得出延时程序所需的循环的次数,以达到以上目的。计算式为:
(人眼的反应时间:响应时间如果超过40毫秒,人眼就会出现运动图像的迟滞现象。)
3.3动画程序流程图
由设计方案画出动画程序流程图如图3-3所示:
5
武汉理工大学《微机原理与接口技术》课程设计说明书
开始 设置显示方式 设置背景色,彩色调板 显示提示信息 结束 从键盘输入任意字符 yes no al=Q?
清屏 no yes
al=空格? 从大到小画矩形 清除痕迹和心 no yes
填充 画点 图3-3动画程序流程图
6
延时 al=任意键? 画十字线 从键盘输入字符 画任意水平垂直线 延时 武汉理工大学《微机原理与接口技术》课程设计说明书
4.汇编语言程序设计
4.1图形显示设计
由程序要求实现的显示效果来看,程序中要引入多种图案,具体由矩形、对角线、任意水平垂直线、“点”等图形来形成整个图案。所以要在程序中出现多次画各种图案来填充整个图形,具体步骤如下:
(1)画矩形,先是设置cx,dx,bx各个寄存器不同的初值,即设置像素点的颜色、坐标个数,接着由大到小画矩形,画每个矩形之前,各个寄存器都要设置不同的初值。 (2)画对角线,和画矩形差不多,每画一条对角线之前各个寄存器也要设置不同的初值。
(3)画任意水平垂直线,画十字线之前,各个寄存器程cx,bx,dx也需要设置不同的初值。
(4)再由大到小画矩形,由程序要显示的效果来分析,还需要再一次引入大大小小的矩形,故还需要再一次由大到小画矩形。
(5)填充,辅助图形画好以后,需要采用行、列坐标连续写像素的方法来填充图形,达到统一合成的效果。
4.2主程序设计
根据上图3-3程序的结构流程图设计汇编语言的主程序。
先设置图形显示方式,用点像素形式来显示图形。然后设置背景色和调色板,利用BIOS功能调用的12号功能,设置像素点的颜色、坐标和个数,从而画出图形所需要的线段,如画矩形、画斜线、画水平垂直线,并采用行、列坐标连续写像素的方法填充图案。完成图形之后延时,清屏。同时,利用DOS系统功能调用的08号功能,从键盘输入字符。如果是任意键,则进入图形显示;如果是空格键,则删除痕迹和点;如果是其他键,则重新显示整个动画;如果是“Q”键,则退出。
4.3子程序设计
为了实现程序效果,程序中还调用了不少的子程序,如填充子程序、画线子程序、画“十”子线子程序、画矩形子程序、画“点”子程序、延时子程序、清屏子程序。具体分析延时子程序和清屏子程序。 (1)延时子程序
先push cx,dx,即先让cx,dx进栈,接着设置dx寄存器的初值为25,利用利用BIOS
7
武汉理工大学《微机原理与接口技术》课程设计说明书
功能调用的12号功能设置cx的初值为2801,利用其13号功能使之循环。在进行循环次数计数(即dx→dx-1)后,判断循环是否结束:如(dx)≠0,继续循环,转移到目标地址d12所在的指令,否则顺序执行。然后dx,cx顺序出栈。最后返回。其具体流程图如图4-1所示:
图4-1延时子程序流程图
(2)清屏子程序
先设置功能号al及寄存器bx,cx,dx的初值,然后进入line循环程序。在line循环程序中,先清除缓冲区并请求指定的输入功能,接着利用BIOS功能调用的10H中断类型实现显示器输出控制。在进行循环次数计数(即cx→cx+1)后,判断循环是否结束:如(cx)≠320,则继续循环,转移到目标地址line所在的指令,否则再设置寄存器cx的初值,在进行循环次数计数(dx←dx+1)后,判断循环是否结束:如(dx)≠200,则继续循环,转移到目标地址line所在的指令,否则顺序执行。最后返回。
其具体流程图如图4-2所示:
8
武汉理工大学《微机原理与接口技术》课程设计说明书
图4-3-2清屏子程序流程图
9
武汉理工大学《微机原理与接口技术》课程设计说明书
5.程序源代码
data segment full db 0
buff1 db ' Welcome you to run this programme!' db ' ' db ' *****Please press any key*****$' buff2 db ' My heart beats with yours!' db ' ***** Please q to quit *****$' data ends code segment
assume cs:code,ds:data start:
main proc far 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
10
武汉理工大学《微机原理与接口技术》课程设计说明书
mov dx,offset 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 inc dx
sub bx,2 cmp cx,94
;显示文本 ;画大矩形 ;显示点所在列号 ;显示点所在行号 ;确定矩形大小 ;调用画方矩形程序
;画矩形移动轨迹,使矩形变化看上去是移动的;由大到小画轨迹矩形
;每次轨迹图的行号和列号是自加1,轨迹图是由大变小;设定每次轨迹图大小减小的程度
;当轨迹方框大小与下一个方框相等时,退出画轨迹
11
武汉理工大学《微机原理与接口技术》课程设计说明书
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
;画第三个矩形 12
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
武汉理工大学《微机原理与接口技术》课程设计说明书
;画小矩形 ;画对角线 ;确定点所在列号 ;确定点所在行号 ;设置对角线长度
13
武汉理工大学《微机原理与接口技术》课程设计说明书
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
;画十字线,确定点所在列号 ;确定点所在行号 ;确定十字线长度 ;调用画线子程序 14
武汉理工大学《微机原理与接口技术》课程设计说明书
mov dx,100 mov bx,60 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
;调用画斜线子程序 ;确定显示点所在列号 ;确定显示点所在行号 ;设置斜线长度 15
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 di,0
mov al,1 mov cx,70 mov dx,20 mov bx,160 call box mov di,0
mov al,1 mov cx,130 mov dx,80 mov bx,40 call box mov di,0 mov cx,95 mov dx,45 mov al,1 mov bx,110 call box mov cx,115
武汉理工大学《微机原理与接口技术》课程设计说明书
;再画大矩形 ;再画小矩形 16
武汉理工大学《微机原理与接口技术》课程设计说明书
mov dx,65 mov al,1 mov bx,70 call box
mov di,1 ;填充 call fill call fill_2 call fill_3
mov cx,149 ;bold mov dx,120 mov al,2 mov bx,60 mov si,0 call draw_line mov cx,151 mov dx,120 mov al,2 mov bx,60 mov si,0 call draw_line
point_: call cls_box call point mov ah,08 int 21h
cmp al,'q' jz ok
cmp al,20h jz point_
;画点
;清除最小方框内的内容 ;调用画点子程序
;从键盘输入一个字符,但不送显示器显示;(al)=’q’ 退出 ;(al)=空格 删除痕迹和点 17
武汉理工大学《微机原理与接口技术》课程设计说明书
call clear ;(al)=其他键,则调用清屏子程序清屏 jmp sss ;清屏后转去执行sss的内容,即动画重复 ok: ;退出分支程序 ret
main endp ;主程序结束 fill proc near ;填充子程序
mov full,0 mov al,5 mov cx,160 mov dx,121 mov si,0 mov bx,60 fill_Y: push cx push dx push bx call draw_line pop bx pop dx pop cx sub bx,2 inc cx add dx,2 inc full cmp full,30 jne fill_y ret fill endp fill_2 proc near
18
武汉理工大学《微机原理与接口技术》课程设计说明书
mov full,0 mov al,5 mov cx,140 mov dx,121 mov si,0 mov bx,60 fill_Y1: push cx push dx push bx call draw_line pop bx pop dx pop cx sub bx,2 dec cx add dx,2 inc full cmp full,30 jne fill_y1 ret fill_2 endp fill_3 proc near mov al,1 mov full,0 mov si,0 mov cx,140 mov dx,121 mov bx,60
19
re_fill: push bx push cx push dx call draw_line pop dx pop cx pop bx inc cx inc full cmp full,9 jne re_fill mov full,0 mov cx,159 mov dx,121 mov bx,60 re_fill2: push bx push cx push dx call draw_line pop dx pop cx pop bx dec cx inc full cmp full,9 jne re_fill2 ret
武汉理工大学《微机原理与接口技术》课程设计说明书
20
武汉理工大学《微机原理与接口技术》课程设计说明书
jne line ret clear endp
cls_box proc near ;清除最小方框内的内容,即清除点
mov al,0 mov bx,0 mov cx,131 mov dx,81 s_line:
mov ah,0ch int 10h inc cx cmp cx,170 jne s_line mov cx,131 inc dx
cmp dx,120 jne s_line ret
cls_box endp code ends
end start
31
武汉理工大学《微机原理与接口技术》课程设计说明书
6心得体会
在本次课程设计中,需要我们对计算机汇编语言有充分的了解和认识,才能根据设计要求编写程序的源代码。在设计过程中,我采用分步设计,先分别设计各个子程序的汇编语言,再编写主程序来调用这些子程序以完成课程设计设计要求的任务和功能。
通过本次的课程设计我对汇编语言有了更好的认识,提高了自己的能力,虽然本次的课程设计综合度较高,没有涉及硬件,但实施起来还是给了我们很大的难度。但是我通过查找参考资料不断请教老师和同学,困难都被一一克服了。
在本次课程设计中,通过对汇编语言知识的综合运用,提高了自己分析问题,思考问题,解决问题的能力。让我重温并巩固了汇编语言的基础知识,真正的做到了学以致用。
32
武汉理工大学《微机原理与接口技术》课程设计说明书
参考文献
[1]周佩玲、彭虎、傅忠谦《微机原理与接口技术》.电子工业出版社,2005.4 [2]于春凡、朱耀庭《宏汇编语言程序设计》.南开大学出版社,1996.6第一版 [3]马瑞芳《汇编语言程序设计》西北工业大学出版社,2002.3第一版 [4]冯博琴主编《微型计算机原理与接口技术》.清华大学出版社,2006.11 [5]齐志儒,高福祥《汇编语言程序设计》.东北大学出版社, 2008.1 [6]沈美明《IBM-PC汇编语言及程序设计实验教程》.清华大学出版社 ,2001
[7]郑初华主编《汇编语言、微机原理及接口技术》.北京,电子工业出版社出版社,2010.6 [8]朱金钧《微机计算机原理及应用技术》. 机械工业出版社.2006 [9](美)布鲁姆. Professional Assembly Language 机械工业出版社
[10](美)埃尔温. Assembly language for intel-board computers. 清华大学出版社
33