汇编语言程序设计动画飞机.docx
《汇编语言程序设计动画飞机.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计动画飞机.docx(45页珍藏版)》请在冰点文库上搜索。
汇编语言程序设计动画飞机
目录
前言-2-
第一章原理图的绘制-3-
1.1电原理图sch的绘制-3-
1.1.1在AltiumDesigner中建立文件-3-
1.1.2绘制电原理图-3-
1.2SCH生成PCB印制板图-6-
1.2.1建立PCB文件-6-
1.2.2将SCH文件生成PCB文件-6-
1.3绘制单片机原理图-7-
第二章汇编语言程序设计-7-
总结-10-
参考文献-11-
附录-12-
附录1单片机原理图-12-
附录2程序清单与注释-13-
前言
《微机应用系统设计与综合实验(实践)》是本科教学过程中的重要环节,是不可缺少的、重要的实践性教学环境。
本次课程设计的目的主要是培养我们运用所学知识解决计算机应用领域内的实际问题,进一步提高我们微机系统设计与综合实践的能力,应用汇编语言综合编程能力、程序调试技巧和微机操作系统分析及操作系统接口综合应用能力。
按照《微机应用系统设计与综合实验(实践》任务书的要求,我选择了三个方面的内容,设计课题分别为:
一、利用电路设计与制版软件AltiumDesigner绘制《函数发生器》中的各种电原理图和印制版图。
二、利用AltiumDesigner或Visio绘制《单片机》原理图。
其中原理图中要包含下内容:
CPU电路,A/D与D/A转换电路,键盘输入输出电路与显示电路,开关量通道电路,通信电路及电源电路。
三、用汇编语言编程编写一个程序。
要求是:
用汇编语言编程编写一个在DOS环境下使用的微型机屏幕保护程序(不能使用“黑屏”法,只能用“变换曲线”等方法)。
程序设计主要是基于我们所学习的80x86指令系统与汇编语言,实施方案是用助记符指令表达汇编语言程序,按照题目所要实现的结果,将实现过程用汇编语言程序表达出来,然后借助于系统通过汇编程序软件的翻译,将汇编语言程序变成机器代码程序,即目标程序,最后经连接定位后可由机器执行。
完成上述的三个方面的内容,即是本次课程设计的目的,最终实现我们灵活运用汇编语言以及熟悉掌握绘图软件的使用的目标,为以后应用这些软件打好了良好的基础。
完成本次课程设计,也要感谢两位老师的指导,得以让本次课程设计顺利的完成。
第一章原理图的绘制
AltiumDesigner软件是Protel软件的原厂商Altium公司推出的Protel系列的新高端本。
它除了全面集成了包括99SE,Protel2004在内的闲钱一系列版本的功能和优点以外,还增加了许多改进和高端功能.
1.1电原理图sch的绘制
原理图的设计流程如下:
1.1.1在AltiumDesigner中建立文件
从Files面板中启动原理图编辑器:
启动AltiumDesigner.
点击系统面板标签“system”,在其弹出的菜单中选择“Files”,打开Files面板。
在Files面板的“Openadocument”区域中双击原理图文件名,启动原理图编辑器,打开一个已有的原理图文件.
在Files面板的“Openadocument”区域中双击项目名称,弹出Projects面板,在项目面板中双击原理图文件名称,启动原理图编辑器,打开一个已有的项目中的原理图文件。
在Files面板的“new”区域中单击“SchematicSheet”,启动原理图编辑器,同时新建一个默认名称为“Sheet1.SchDoc”的原理图文件。
1.1.2绘制电原理图
1)创建一个PCB项目
A、启动AltiumDesigner。
B、执行菜单命令File\New\Project\PCBProject,弹出选择PCB项目面板,见下图。
C、项目面板中显示的是系统已默认默认名称创建的新项目文件“PCBProject1.PriPCB”,执行菜单命令File\SaveProject,在弹出的保存文件对话框中,在文件名称文本框中输入文件名,单击“保存”按钮,项目即以所输入的名称保存在默认文件夹“Examples”中,也可以指定别的保存路径,菜单命令为File\Saveas。
2)为项目添加原理图文件
A、执行菜单命令File\New\Schematic,在所命名的项目中创建一个新的原理图文件,此时在项目面板中下面出现“Sheet.SchDoc”文件名称。
B、执行菜单命令File\Save,在弹出的保存文件文件对话框中输入文件名,单击“保存”按钮,见下图。
执行菜单命令File\Saveas,文件另存为。
3)打开库文件面板
A、执行菜单命令Design\BrowesLibrary…,或单击面板标签System,选中库文件面板“Libraries”,弹出库文件面板,见下图。
B、在库文件面板中,双击当前文件名称,即可放置元件。
AltiumDesigner系统默认打开的集合元件库中有两个时常用的,常用分立元器件库MiscellaneousDevices.Intlib和常用接插件库MiscellaneousConnectors.Intlib。
C、选择元器件
在我选择的电原理图中所用到的元器件,以及元件所在的零件库如下表所示:
元件
零件名
零件库
电阻
RES2
MiscellaneousDevices.lib
电容
CAP
MiscellaneousDevices.lib
二极管
DIODE
MiscellaneousDevices.lib
可调电阻
POT2
MiscellaneousDevices.lib
三极管
NPN
MiscellaneousDevices.lib
芯片
E1-16
AnalogDevices.lib
4)连接元器件
在writingtools工具栏中选择接线,把各元器件用导线连接起来。
在需要的地方,还要设置相应的网路标号,还有电源地的设置。
1.2SCH生成PCB印制板图
1.2.1建立PCB文件
在Documents目录下新建一个PCB文件,使SCH和PCB文件在同一个目录下。
1.2.2将SCH文件生成PCB文件
1)在Libraries中依照1.1节所提到的步骤,添加自动布线要用到的封装库。
2)对所有元器件进行封装。
在SCH中,选择每个元器件,在它们的属性中的PCB设置中,输入每个元器件所对应的封装零件名。
所用的元器件所对应的封装零件名以及所在零件封装库名如下表所示:
元件
封装零件名
所在封装库名
电阻
AXIAL0.3
PCBFootprints.lib
电容
RAD0.1
PCBFootprints.lib
可调电阻
VR1
PCBFootprints.lib
二极管
DIODE0.4
PCBFootprints.lib
三极管
TO-126
PCBFootprints.lib
三极管
TO-126
PCBFootprints.lib
3)将所有元器件都封装完以后,在Design下拉菜单中点击“UpdatePCB”更新PCB,如果在零件封装时出现问题,在执行此步骤时,会给出相应的提示,可以根据提示在SCH图中进行修改,直至没有错误出现为止。
4)导入SCH更新后,在PCB的“View”下拉菜单中选择“FitBoard”,这样,零件就都可以显示出来了,与SCH图中是一一对应的关系。
5)在PCB文件中画一个PCB的外型框,然后把PCB零件封装移动到自己所画的外型框中。
6)对元件适当的进行一下布局,然后校验一下,看是否有错误,没有错误就可以开始自动布线了。
在AutoRoute下拉菜单中选择“All”,在弹出的对话框中,进行设置,然后点击“RouteAll”。
自动布线完成后弹出对话框,点击“OK”。
PCB图就这样完成了。
1.3绘制《单片机》原理图
《单片机》原理图的绘制与1.1节中提到的用AltiumDesigner绘制电原理图的步骤是一致的,在这里不再赘述。
绘制的《单片机》原理图见附录1。
第二章汇编语言程序设计
用汇编语言编程编写一个程序。
要求是:
用汇编语言编程编写一个动画程序:
有一架飞机在显示屏上方,从左至右,忽高忽低,周而复始的飞行,屏幕下方设有一架高射炮,该高射炮可人工控制左右移动,人工控制空格键发射炮弹,炮弹命中飞机后,声光大作。
(要求使用图形显示方式)。
此次编程主要用到INT10H指令。
INT10H中断简介
INT10H是由BIOS对屏幕及显示器所提供的服务程序,而后倚天公司针对倚天中文提供了许多服务程序,这些服务程序也加挂在INT10H内。
使用INT10H中断服务程序时,先指定AH寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用INT10H。
下表是它们的说明:
AH=00H
AH=00/INT10H是用来设定显示模式的服务程序,AL寄存器表示欲设定的模式:
此次编程时设置AL=05,即分辨率为320*200。
AH=0BH
这个服务程序是选择调色盘。
显示模式5是320*200的图形模式,最多可以显示4种颜色,这四种颜色的意思是最多可以『同时』显示一种背景色及三种前景色,而这三种前景色有两种方式可供选择,因此事实上,在显示模式5有两种调色盘可供选择。
就好像您去买12种颜色的水彩,但可在调色盘上以任意比例搭配出许多种颜色。
调色盘0的三色是绿、红、黄;调色盘1的三色是青、紫红、白。
背景色有16六种可供选择,这16种就是注一的16色。
调用此中断时,先决定要设定背景色抑或调色盘,
1)要设定背景色时,则使BH为0,再使BL之数值为0到0fh之间表示注一的16色之一。
2)要设定调色盘时,则使BH为1。
再设定BL为零或一表示选择那一种调色盘。
背景色只有在前景色为0时才会显现出来。
AH=0Ch/INT10H
这个服务程序是在绘图模式中显示一点(也就是写入点像,writegraphicspixel),而AH=0DH/INT10H则是读取点像(readgraphicspixel)。
写入时,要写入位置X座标存于CX寄存器,Y座标存于DX寄存器,颜色存于AL寄存器。
和文字模式相同,萤光幕上的Y座标是最上面一列为零,越下面越大,X座标则和数学的定义相同。
CX、DX、AL值之范围与显示模式有关:
AH=0DH/INT10H则是读取某一位置之点像,您必须指定CX、DX,而INT10H会传回该位置点像之颜色。
AH=0EH
这个子程序是使显示器像打字机一样的显示字符来,在前面用AH=09H/INT10H和AH=0AH/INT10H都可以在萤光幕上显示字符,但是这两奘方式显示字符之后,光标位置并不移动,而AH=0EH/INT10H则会使光标位置移动,每显示一个字符,光标会往右移一格,假如已经到最右边了,则光标会移到最左边并移到下一列,假如已经移到最下面一列的最右边,则屏幕会向上卷动。
AL寄存器存要显示的字符,BH为目前的显示页,如果是在图形模式,则BH须设为0,假如是在图形模式下,也可以设定BL来表示文字的颜色,文字模式下的BL则无功能。
总结
《微机应用系统设计与综合实验(实践)》作为自动化本科生教学的主要基础课之一,课程紧密结合电子信息类的专业特点,围绕微型计算机原理和应用主题,以Intelx86CPU为主线,系统介绍微型计算机的基本知识,基本组成,体系结构和工作模式,从而使学生能较清楚地了解微机的结构与工作流程,建立起系统的概念。
在大三接触汇编语言之前,我们在计算机组成原理课程中就已经有所了解了,但也只是略微明白一些如jmp,mov这样的指令,极度缺乏系统性的学习。
但在接触这门课程后,感到汇编语言并不是很容易就可以弄懂的。
相比较以前学过的高级语言如C等,电脑等于在迁就人的思维方式,但学汇编,人却必须要去迁就电脑的思维方式,要设身处地地用电脑的角度去思考问题,这是我学习汇编语言时遇到的最大的障碍。
另外,在C语言中不到10个语句构成的程序,用汇编语言却要好几十行甚至上百行。
这不得不让我对汇编产生一种恐惧感。
但经过这次微机原理课程设计的时间,我发现这是完全不必要的。
一旦对它的原理掌握后,编写程序就容易多了。
另外,经过这次设计实践和学习,让我更加了解计算机内部的组织结构,提升了汇编编程的综合能力。
我明白了汇编的学习不仅仅是学习其语法,而更多的是学习计算机基本的体系结构。
其中遇到使用新的概念,名字,指令时,自己要采用亲手查资料和亲手编程的方式也就渐渐清晰明了。
经过这次课程设计,我也慢慢摸出了汇编学习的规律。
首先,学习这门语言时如果能联系上以前学过的其他高级语言的知识,则会起到良好的效果。
例如C语言程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(IF...THEN...ELSE...),循环结构(FOR...NEXT)三种结构,也通过C语言了解并掌握了什么是子程序,什么是调用。
事实上,汇编语言中有关程序结构,子程序等等的知识都是跟C语言十分相似的,只是在编程时用到的语言不同:
汇编语言完全面向机器,需要指明数据在寄存器、内存中的流向。
第二,学习汇编语言,首要问题是学习80X86指令系统。
如果能将指令系统中的各个助记符、格式等都能完全掌握并灵活运用,大部分工作就已经完成了。
指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。
如果不熟悉汇编指令的功能及其有关规定,那肯定不能灵活使用汇编语言。
在编写汇编程序时,应该注意特别容易出现的错误,例如在编写数据传送指令时,目的操作数和源操作数的类型一定要匹配,CS不能作为目的操作数,offset后只能跟简单地址符号,等等。
汇编语言中的程序结构,子程序等知识也会帮助我们编写出一个更加完善的汇编程序。
另外,我们还应该掌握DOS系统功能调用,宏汇编等知识。
这里要对子程序和宏汇编加以区分,我的理解是:
子程序是调用,而宏是替换,比如一个MAX宏,所有出现MAX的地方,都用宏代码代替。
还有一点十分重要。
和所有的程序设计语言一样,要学好汇编语言,实验是必不可少的环节。
我深有体会:
书上的程序都能看懂,基本原理也都明白,但是在自己亲手编写程序时,却无从下手,甚至连第一句该怎么写都不知道。
通过实验,可以在很大程度上加深印象。
在书上看程序,一切都是理所当然,十分顺利,而自己动手,才会真正发现自己的不足之处。
程序的编写在记事本中进行即可,掌握debug的使用对实验是有很大帮助的。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
现在汇编语言的课程设计即将结束了,设计过程中遇到的所有困难以及遗留的难点都需要我逐步攻克,其中也充满了困惑和喜悦。
此外,在黎群辉和伍侠云两位老师的身上我学得到很多实用的知识,在此我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
参考文献
《微型计算机原理与接口技术》周荷琴、吴秀清编著中国科学技术大学出版社
《IBM-PC汇编语言程序设计(第二版)》沈美明、温冬婵编著
清华大学出版社
《AltiumDesigner实用宝典—原理图与PCB设计》闫胜利编著
电子工业出版社
《AltiumDesigner完全电路设计》张义和编著机械工业出版社
附录
附录1《单片机》原理图
附录2程序清单与注释
DATASEGMENT
P_XDW145;高射炮起始左下角横坐标150
P_YDW195;高射炮起始左下角纵坐标195
P_PIXDB1;高射炮颜色
PD_PIXDB2;炮弹颜色
PD1_XDW0;炮弹1起始横坐标
PD1_YDW0;炮弹1起始纵坐标
PD1_BOORDW0;炮弹1标志,1:
画炮弹,0:
不画炮弹
PD2DW0,0,0;炮弹2起始坐标,标志
PD3DW0,0,0;炮弹3起始坐标,标志
PD4DW0,0,0;炮弹4起始坐标,标志
PD5DW0,0,0;炮弹5起始坐标,标志
PD6DW0,0,0;炮弹6起始坐标,标志
PD7DW0,0,0;炮弹7起始坐标,标志
PD8DW0,0,0;炮弹8起始坐标,标志
PD9DW0,0,0;炮弹9起始坐标,标志
PDADW0,0,0;炮弹A起始坐标,标志
PDBDW0,0,0;炮弹B起始坐标,标志
PDCDW0,0,0;炮弹C起始坐标,标志
C_XDW0
C_YDW0
C_X0DW0;飞机中心坐标
C_Y0DW75
C_RDB37;半径
C_PIXDB3;飞机颜色
C_DDB0
C_LXDW0;飞机左下角坐标
C_LYDW75
C_BOORDB10;飞机运行标志,大于10上升,小于10下降
F_BOORDB0;飞机击中标志
FREQ_LISTDW371,495,495,495,624,556,0;频率表
TIME_LISTDB4,6,2,4,4,6;时间表
F_NUMDB0
T_NUMDB0
DATAENDS
STACKSSEGMENT
DB128DUP(?
)
STACKSENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACKS
INCLUDEJ:
\1.52\pao.asm
INCLUDEJ:
\1.52\FEIJI.ASM
START:
MOVAX,DATA
MOVDS,AX
MOVAH,0
MOVAL,5;320*2004色方式
INT10H
LOOP1:
movax,0600h;清屏
movbh,00
movcx,0000h
movdx,184fh
int10h
MOVAH,0BH;选择调色盘
MOVBH,01
MOVBL,0;绿、红、黄调色盘
INT10H
CALLPAO
CALLDAOHANG
CALLHANG1
CALLDELAY
MOVAH,01H
INT16H
JZLOOP1
LOOP2:
movah,00h;按键判断左右控制大炮,空格发射炮弹,esc退出
int16h
CMPAX,4B00H
JEPR1
CMPAX,4D00H
JEPR2
CMPAL,20H
JEPR3
CMPAL,1BH
JEQUIT
JMPLOOP1;左移
PR1:
SUBP_X,9
CMPP_X,5
JGPR11
MOVP_X,5
PR11:
JMPLOOP1;右移
PR2:
ADDP_X,9
CMPP_X,285
JBPR21
MOVP_X,285
PR21:
JMPLOOP1;发射
PR3:
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVCX,12
MOVBX,OFFSETPD1_X
L1:
CMP[BX+4],0
JZL2
ADDBX,6
LOOPL1
L2:
MOVAX,P_X;炮弹初始坐标
ADDAX,14
MOV[BX],AX
MOVAX,P_Y
SUBAX,15
MOV[BX+2],AX
MOVDX,1
MOV[BX+4],1;允许画炮弹
POPDX
POPCX
POPBX
POPAX
JMPLOOP1
QUIT:
MOVAH,4CH
INT21H
DELAYPROCNEAR
PUSHCX
PUSHDX
PUSHBX
PUSHAX
MOVDX,5000
DL1:
MOVCX,5500
DL2:
MOVAH,01H
LOOPDL2
DECDX
JNZDL1
POPAX
POPBX
POPDX
POPCX
RET
DELAYENDP
PAOSHENGPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
MOVDX,43H;初始化8254工作方式
MOVAL,0B6H;定时器3、方式3
OUTDX,AL
MOVSI,OFFSETFREQ_LIST;装入频率表起始地址
MOVDI,OFFSETTIME_LIST;装入时间表起始地址
MOVBX,0
MOVBL,F_NUM
ADDSI,BX
MOVBL,T_NUM
ADDDI,BX
MOVDX,61H
INAL,DX
PUSHAX
ORAL,03H
OUTDX,AL
MOVDX,0FH;输入时钟为1.0416667MHz,1.0416667M=0FE502H
MOVAX,0E502H
DIVWORDPTR[SI];取出频率值计算计数初值,0F4240H/输出频率
MOVDX,42H
OUTDX,AL;装入计数初值
MOVAL,AH
OUTDX,AL
MOVDL,[DI];取出演奏相对时间,调用延时子程序
CALLDALLY1
ADDSI,2
INCDI
ADDF_NUM,2
INCT_NUM
POPAX
MOVDX,61H
OUTDX,AL
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
RET
PAOSHENGENDP
DALLY1PROC;延时子程序
D0:
MOVCX,200H
D1:
MOVAX,0FFFFH
D2:
DECAX
JNZD2
LOOPD1
DECDL
JNZD0
RET
DALLY1ENDP
CODEENDS
ENDSTART
;飞机程序
HANGPROCNEAR;飞机飞行路线
PUSHAX
PUSHBX
PUSHCX
PUSHDX
CALLFEIJI
MOVAX,C_Y0
CMPC_BOOR,10
JNEH_L3
CALLRAND;产生飞机飞行参数,0-20的随机数
MOVC_BOOR,BL
H_L3:
CMPC_BO