图形变换程序设计.docx
《图形变换程序设计.docx》由会员分享,可在线阅读,更多相关《图形变换程序设计.docx(40页珍藏版)》请在冰豆网上搜索。
![图形变换程序设计.docx](https://file1.bdocx.com/fileroot1/2023-1/23/f4a40c53-edd6-4e96-8efd-f93062b744f7/f4a40c53-edd6-4e96-8efd-f93062b744f71.gif)
图形变换程序设计
学号:
课程设计
题目
图形变换程序设计
学院
自动化学院
专业
电气工程及其自动化
班级
姓名
指导教师
2013
年
1
月
5
日
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
自动化学院
题目:
图形变换程序设计
初始条件:
掌握8086汇编语言程序设计方法,设计一个图形变换显示程序。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.程序运行后,键盘输入不同进行不同处理:
(1)输入‘Q’,显示‘ThankYou!
’并结束程序;
(2)输入‘A’,显示由16个*构成的菱形图案并变换颜色;输入‘B’,显示10个*构成的五角星图案并变换颜色;输入‘C’,显示25个*构成的菱形图案并变换颜色;输入‘D’,显示12个*构成的三角形图案并变换颜色;输入‘E’,显示一个用不同颜色填充且带有边框的矩形图案;输入‘F’,显示一个用不同颜色填充的圆形图案。
2.撰写课程设计说明书。
内容包括:
摘要、目录、正文、参考文献、附录(程序清单)。
正文部分包括:
设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。
时间安排:
12月26日-----12月28日查阅资料及方案设计
12月29日-----1月2日编程
1月3日-----1月7日调试程序
1月8日-----1月9日撰写课程设计报告
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
摘要
图形变换程序的设计是利用微机中的BIOS或DOS中断显示调用功能在屏幕上根据要求显示各种图形的变换。
在存储器系统中从地址0FE000H开始的8KROM中装有BIOS例行程序,DOS是PC机上最重要的操作系统,它是由软盘或硬盘提供的,它的两个DOS模块IBMBIO.COM和IBMDOS.COM使DOS用起来更加方便。
其中,IBMBIO.COM是一个输入/输出设备处理程序,它提供了DOS到ROMBIOS的低级接口,它完成将数据从外设读入内存或把数据从内存写到外设去的工作。
IBMDOS.COM包括一个文件管理程序和一些处理程序,在DOS下运行的程序可以调用这些处理程序。
为了完成DOS功能调用,IBMDOS.COM把信息传送给IBMBIO.COM,形成一个或多个BIOS调用。
用户通过对BIOS或DOS的调用,可以达到对显示屏幕的控制。
本课程设计的任务是在屏幕上输出不同的图形,需要在显卡的相应地址区写入不同的内容,从而达到图形变换的目的,同时,为了根据输入的不同字符显示不同的图形,本例调用了键盘中断int9,以达到任意切换的要求。
关键词:
图形变换DOS调用BIOS调用键盘中断
1.设计目的
通过一个学期的微机原理的学习,我们已经初步的认识了8086的相关功能及其特点,学习了相关的指令及指令集,但是作为一名理工科的学生,光学习书本上面的知识是远远不够的,自己动手实践探索,才能将书本上的内容烂熟于心,才能正真意义上的解决问题,因此微机原理的课程设计应运而生。
课程设计的目的在于锻炼学生各方面的能力,如查阅书籍,收集信息,灵活运用所学知识的能力等。
同时通过在课程设计过程中的学习,能够独立自主的将学到的知识和平时生活实际相联系,达到学而活用,学而自用,学而能用的目的。
从而达到进一步深入学习,锻炼自学,启发动手和自我思维的目的。
微机原理这么课程融合了像汇编语言,硬件,软件,基本输入输出,串行并行等多中知识,我们学习使用的集成环境emu8086其实是在很大程度上能够帮我们学习8086的编程与设计的,而这种基本的设计跟编程能力在今后的学习生活和工作中是必不可少的,因此,这次我们选择的课题是——图形变换程序设计,图形变换,基本上就是设计缓冲区将需要的图形先设计出来,后面更重要的就是按照所需要的要求进行变换颜色,而各种功能的切换跟调用,这才是我们进行课设的难点和重点。
因此大量的查阅书籍跟必要的调试工作是非常必要的。
2.设计思路
通过对设计任务的分析:
程序运行后,键盘输入不同进行不同处理:
(1)输入‘Q’,显示‘ThankYou!
’并结束程序;
(2)输入‘A’,显示由16个*构成的菱形图案并变换颜色;输入‘B’,显示10个*构成的五角星图案并变换颜色;输入‘C’,显示25个*构成的菱形图案并变换颜色;输入‘D’,显示12个*构成的三角形图案并变换颜色;输入‘E’,显示一个用不同颜色填充且带有边框的矩形图案;输入‘F’,显示一个用不同颜色填充的圆形图案。
我们小组通过分工,我分到的任务是设计一个五角星图案跟一个三角形图案,一来是因为五角星比较好看,制作起来比较有挑战性,另外三角形通过上下角度的平移,设计起来也很不错的,我的设计思路就是这样。
程序的总体流程图如图2.1所示。
图2.1程序的总体流程图
3.设计过程与步骤
3.1相关理论介绍
3.1.1DOS中断与BIOS中断的功能及调用
BIOS中断类型见表3-1:
表3-1
中断号
中断名称
中断号
中断名称
20
程序终止
27
结束并驻留内存
21
功能调用
28
键盘忙循环
22
终止地址
29
快速写字符
23
Ctrl_C中断向量
2A
网络接口
24
严重错误向量
2E
执行命令
25
绝对磁盘读
2F
多路转接接口
26
绝对磁盘写
30-3F
保留给DOS
DOS中断类型见表3-2:
表3-2
10
显示器I/O
16
键盘I/O
11
取设备信息
17
打印机I/O
12
取内存容量
18
ROMBASIC
13
磁盘I/O
19
引导装入程序
14
RS-232串行口I/O
1A
时钟
15
磁带I/O
40
软盘BIOS
DOS功能与BIOS功能都通过软件中断调用。
在中断调用前需要把功能号装入AH寄存器,把子功能号装入AL寄存器,除此而外,通常还需在CPU寄存器中提供专门的调用参数。
一般地说,调用DOS或BIOS功能时,有以下几个基本步骤:
(1)将调用参数装入指定的寄存器中;
(2)如需功能号,把它装入AH;
(3)如需子功能号,把它装入AL;
(4)按中断号调用DOS或BIOS中断;
(5)检查返回参数是否正确。
本例中需要的BIOS中断见表3-3:
表3-3
INT
AH
功能
入口参数
出口参数
10
09H
表示在当前的光标处按指令属性显示字符
AH=09H
AL=字符
BH=显示页码
BL=属性
CX=重复输出字符的次数
无
10
02H
用文本坐标下设置光标位置
AH=02H
BH=显示页码
DH=行(Y坐标)
DL=列(X坐标)
无
21
01H
从键盘输入一个字符
无
AL=ASCII
21
02H
在屏幕上显示一个字符
DL=ASCII
无
16
01H
读取键盘状态,即读入输入字符
AH=01H—检查普通键盘
ZF=1——无字符输入,否则,AH=键盘的扫描码,AL=按键的ASCII码(字符键)或者0(其他键)
16
00H
从键盘读入字符
AH=00H—强制读普通键盘
AH=键盘的扫描码
AL=按键的ASCII码(字符键)或者0(其他键)
10
08H
读光标处的字符及其属性
AH=08H
BH=显示页码
AH=属性
AL=字符
21
06H
1号2号功能的组合
DL=0FFH时为1号功能;DL寄存器放入字符的ASCII值时就是2号功能
无或AL=ASCII
1A
02H
读取时间
AH=02H
CH=BCD码格式的小时;CL=BCD码格式的分钟;DH=BCD码格式的秒;DL=00H——标准时间,否则,夏令时;CF=0——时钟在走,否则,时钟停止
3.1.2子程序的设计
子程序又称为过程,它相当于高级语言中的过程和函数。
在一个程序的不同部分,往往要用到类似的程序段,这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把这些程序段写成子程序形式,以便需要时可以调用它。
过程定义伪操作用在过程(子程序)的前后,使整个过程形成清晰的、具有特定功能的代码块。
其格式为:
procedurenamePROCAttribute
…
procedurenameENDP
其中过程名为标识符,它又是子程序入口的符号地址。
它的写法和标号的写法相同。
属性(attribute)是指类型属性,它可以是NEAR或FAR。
段内调用使用NEAR属性,段间调用使用FAR属性。
为了使用户的工作更加方便,80x86的汇编程序用PROC伪操作的类型属性来确定CALL和RET指令的属性。
也就是说,如果所定义的过程是FAR属性的,那么对它的调用和返回一定都是FAR属性的;如果所定义的过程是NEAR属性的,那么对它的调用和返回也一定是NEAR属性的。
这样,用户只需在定义过程时考虑它的属性,而CALL和RET的属性可以由汇编程序来确定。
用户对过程属性的确定原则很简单,即:
1如调用程序和过程在同一个代码段中,则使用NEAR属性;
2如调用程序和过程不在同一个代码段中,则使用FAR属性。
3.1.3中断概述
CPU在执行某一程序的过程中,出现了内部或外部某些事件的请求,CPU暂时停止当前程序的正常执行,转去执行请求事件的处理工作,CPU在事件处理结束后又继续原来的程序,这个过程称作中断。
中断程序的入口地址称作中断向量。
8086中断系统最多可以支持256个中断源,系统将这些中断向量按照中断类型码的顺序依次存放在内存RAM的最低地址区的1024个内存单元中,这就构成了中断向量表。
中断向量表的逻辑地址范围为0000H:
0000H-0000H:
03FF。
另外,中断向量在中断向量表中的位置就是中断向量地址,它与中断类型码之间的关系可以表示如下:
中断向量地址=0000H:
中断类型码*4
CPU在响应中断后,根据中断源提供的中断类型码,首先计算出中断向量地址,然后根据中断向量地址在表中查找到相应的中断服务程序的入口地址。
本例中即利用了键盘中断来实现相应的功能。
3.2设计步骤
中断子程序的设计说明:
该程序完成的是在按下其他键时实现不同图形之间的任意切换。
实现过程是通过改变原键盘中断入口向量地址,使用户在输入其他字符时,原图形能从循环中退出,转向新的图形的子程序。
同时,在重设的中断向量地址程序中,再次将原键盘中断的入口地址复原,以便程序能够正确的判断出输入的新字符。
3.2.1五角星子程序
五角星子程序和流程图如图3.1和3.2所示
starprocnear
pushbx
pushcx
pushdx
pushes
moves,dx
leasi,a3
movdi,0
movbx,0
movcx,7
b1:
pushcx
movcx,17
b2:
moval,[si]
moves:
[bx+di],ax
incsi
adddi,2
loopb2
popcx
addbx,0a0h
movdi,0
loopb1
popes
popdx
popcx
popbx
ret
starendp
star_1procnear图3.1star子程序流程图
pushax
pushdx
c
allclear_screen
calldelay
movwordptres:
[9*4],offsetint9
movwordptres:
[9*4+2],cs
movcx,01h
lop4:
movah,8ah
movdx,0b854h
callstar
calldelay
movah,8ch
movdx,0b854h
callstar
calldelay
movah,89h
movdx,0b854h
callstar
calldelay
movah,8eh
movdx,0b854h
callstar
Y
calldelay
Y
movah,8dh
movdx,0b854h
callstar
calldelay
looplop4图3.2star_1子程序流程图
popdx
popax
ret
star_1endp
从程序可以看出,其与菱形的显示程序基本相同,只需
改动显示字符的偏移地址即可。
至于图形的显示颜色和显示
地址则可根据需要进行修改。
本例中调用了两次star来显
示变换的五角星,实现了题目的要求。
3.2.2三角形子程序
三角形子程序和流程图如图3.3和3.4所示
angleprocnear
pushbx
pushcx
pushes
moves,dx
leasi,a4
movdi,0
movbx,0
movcx,5
d2:
pushcx
movcx,17
d3:
moval,[si]
moves:
[bx+di],ax
incsi
adddi,2
loopd3
popcx
addbx,0a0h
movdi,0图3.3angle子程序流程图
loopd2
popes
popcx
popbx
ret
angleendp
angle_1procnear
pushax
pushdx
callclear_screen
calldelay
movwordptres:
[9*4],offsetint9
movwordptres:
[9*4+2],cs
movcx,01h
lop6:
movah,8ah
movdx,0b854h
callangle
calldelay
movah,8ch
movdx,0b854h
callangle1
calldelay
movah,89h
movdx,0b854h
callangle
calldelay
movah,8eh
movdx,0b854h
callangle1
calldelay
图3.4angle_1子程序流程图
movah,8dh
movdx,0b854h
callangle
calldelay
looplop6
popdx
popax
ret
angle_1endp
从程序可以看出,其与菱形和五角星的显示程序基本相同,只需改动显示字符的偏移地址即可。
至于图形的显示颜色和显示地址则可根据需要进行修改。
本例中调用了三次angle来显示变换的三角形,实现了题目的要求。
3.2.3退出显示子程序
退出显示子程序的流程图如图3.5所示
sqprocnear
pushax;相关寄存器入栈
pushbx
pushcx
pushdx
pushes
callclear_screen;清屏
movax,0b872h;设置显示的段首址
moves,ax
图3.5退出显示子程序流程图
leasi,a2;取显示字符的偏移地址
movdi,0
movcx,10;循环次数(字符个数)
s4:
moval,[si];设置显示字符和颜色属性
movah,0ah
moves:
[bx+di],ax
incsi;偏移地址增加
adddi,2
loops4
popes;相关寄存器出栈
popdx
popcx
popbx
popax
ret
sqendp
同样,由该子程序可知,其与图形变换相类似,故相关说明不再赘述。
当然,字符串的输出也可直接由DOS中断调用来完成,本例中并未使用,但同样完成了题目的要求。
3.2.4中断子程序和清屏子程序
A)中断程序
int9:
movax,0
movax,es
movdx,int9ip
movwordptres:
[9*4],dx;-----------恢复原中断向量地址
movdx,int9cs
movwordptres:
[9*4+2],dx
pushf;----------------标志寄存器出栈
calldwordptrds:
int9ip
STI;----------------开中断
jmpinput;----------------转移到输入判断处
iret
本例中,通过修改键盘中断的相关程序即可实现不同图形之间的任意切换,从而达到题目所要求的目的。
B)清屏子程序
clear_screenprocnear
pushax;----------------相关寄存器入栈
pushbx
pushcx
pushdx
movah,06h;----------------功能号
moval,00h;----------------全屏幕空白
movbh,00h;----------------黑底黑字
movch,0;----------------左上角行号
movcl,0;----------------左上角列号
movdh,24;----------------右下角行号
movdl,79;----------------右下角列号
int10h;----------------中断调用
popdx;----------------相关寄存器出栈
popcx
popbx
popax
ret
clear_screenendp
清屏子程序在程序中起清除前段图形的功能,即在按下其他键时,屏幕上立刻显示出当前想要得到的图形,不受前面图形的影响。
3.3程序调试过程
3.3.1emu8086简介
Emu8086结合了一个先进的原始编辑器、组译器、反组译器、具除错功能的软件模拟工具(虚拟PC),还有一个循序渐进的指导工具。
这对刚开始学组合语言的人会是一个很有用的工具。
它会在模拟器中一步一步的编译程序码并执行,视觉化的工作环境让它更容易使用。
你可以在程序执行当中检视暂存器、旗标以及记忆体。
模拟器会在虚拟PC中执行程序,这可以隔绝你的程序,避免它去存取实际硬体,像硬碟、记忆体,而在虚拟机器上执行组合程序,这可以让除错变得更加容易。
这个软件完全相容於Intel的下一代处理器,包括了PentiumII、Pentium4,而相信Pentium5也会继续支援8086的。
这种现象让8086程序码的可携性相当高,它可以同时在老机器以及现代的电脑是执行,8086的另一个优势是它的指令比较小且相当容易学习。
该软件包含了学习汇编语言的全部内容。
Emu8086集源代码编辑器,汇编/反汇编工具以及可以运行debug的模拟器(虚拟机器)于一身,此外,还有循序渐进的教程。
这套软件对于刚开始学习汇编语言的朋友非常有帮助.它能够编译源代码,并在模拟器上一步一步的执行。
可视化界面令操作易如反掌.可以在执行程序的同时可观察寄存器,标志位和内存.算术和逻辑运算单元(ALU)显示中央处理器内部的工作情况.
这个模拟器是在一台"虚拟"的电脑上运行程序的,它拥有自己独立的“硬件”,这样你程序就同诸如硬盘与内存这样的实际硬件完全隔离开,动态调试(DEBUG)时非常方便.8086的机器代码同INTEL下一代微处理器完全兼容,包括PentiumII和Pentium4,我相信 Pentium5 同样也会支持 8086指令.这意味着8086代码具有很广泛的应用范围,它在老式的和最新的计算机系统上都能工作.
8086指令的另外一个优点是它的指令集非常小,这样学起来会容易得多.Emu8086 同主流汇编程序相比,语法简单得多,但是它能生成在任何能兼容8086机器语言的代码。
注意:
如果你不使用Emu8086编译程序,那你无法在运行的时候单步跟踪。
Emu8086界面见图3.6
图3.6Emu8086界面
3.3.2输出五角星的显示界面
当程序运行后,输入按键B,屏幕显示见图3.7和整体效果图3.8
图3.7部分图
图3.8整体效果图
3.3.3输出三角形的显示界面
当程序运行后,输入按键D,屏幕显示见图3.9和整体效果图3.10
图3.9部分图
图3.10整体效果图
3.3.4退出的显示界面
需要退出是,按下键Q/q均可退出,显示界面见图3.11
图3.11退出界面
4.小结与体会
通过这次课程设计,让我进一步掌握了8086的相关指令的使用和相关DOS跟BIOS的调用功能,由于此次课程设计的趣味性比较强,学习操作的空间也比较大,不懂的东西通过与同学之间的相互讨论以及与查阅相关的书籍都可以迎刃而解,值得注意的是,8086的代码指令在此次课设中占的比重非常大,写程序代码是一件非常费脑筋的活,而且要求我们有足够的耐性跟认真,如果稍有差错或者是格式错误,甚至多加或者漏掉一个阿拉伯数字都有可能是程序运行不完全,达不到想要的目的。
另外通过此次课程设计,我也发现了自己很多方面的问题。
第一,平时只注重理论知识,而缺少实践。
按道理来说,课设所要用到的很多知识自己平时都系统的学过,但等到自己真正想用的时候却不知道如何下手。
这点在今后的学习中要引起注意。
第二,自己快速学习的能力有待提高。
这次微机课设,虽然只用了很少部分的课外知识,但是自己却不能很好的掌握,以后一定要更加注重理论与实践的相互配合,才能更好的锻炼自己。
参考文献
[1]周佩玲,彭虎,傅忠谦.微机原理与接口技术(基于16位机).北京:
电子工业出版社,2005
[2]钱晓捷.汇编语言程序设计学习与解题指南.武汉:
华中科技大学出版社,2002
[3]黄明,梁旭,常征.汇编语言程序设计习题详解.北京:
机械工业出版社,2004
[4]王永山,杨宏五,杨婵娟.微型计算机原理与应用(第二版).西安:
西安电子科技大学出版社,2006
[5]张晓明.汇编语言程序设计.北京:
国防工业出版社,2009
附录
程序(完整版):
assumecs:
code,ds:
data,ss:
sst
;-----------------------------