微机原理.docx
《微机原理.docx》由会员分享,可在线阅读,更多相关《微机原理.docx(11页珍藏版)》请在冰豆网上搜索。
![微机原理.docx](https://file1.bdocx.com/fileroot1/2023-1/14/aa3fc180-3fbc-402c-bd19-d923a452b344/aa3fc180-3fbc-402c-bd19-d923a452b3441.gif)
微机原理
郑州航空工业管理学院
微机原理课程设计说明书
2012级电气工程及其自动化专业1206972班级
题目字符图形显示
姓名学号120697226
指导教师王义琴职称讲师
二О一二年十二月十三日
摘要
本次课程设计是通过编写汇编语言程序,实现字符图形的显示,具体实现的方法可以通过在MASM使用环境下运行,也可以通过在DOS环境下完成。
元旦即将到来,所以我显示的字符是“元旦”。
在编写初期,我对字符“元旦”进行了设计,确定了每个字符所在的位置,以便在编写程序的时候正确定义字符的属性,也为在显示的时候能够显示较好的效果,打下了基础。
接着开始编写程序,编写完程序后,对程序进行了注释,最后调试出所要求的字符。
本程序可以在DOS环境和MASM环境下运行,要求我们熟悉BIOS中断10的各种功能,因此程序编写前,我先认真学习了该BIOS中断的有关功能。
万事开头难,一旦了解了设计此程序的原理,并在此基础上掌握相关的技术,其他的工作也就跟着展开来。
关键词:
字符显示,10号中断,图形,BIOS
一、设计目的
本次设计的目的主要是为了让大家进一步的学会汇编程序的编译,链接,执行操作。
深入了解利用汇编指令是如何实现对存储器及寄存器访问的,并在此基础上学会用汇编指令、伪指令、BIOS中断调用、DOS中断调用及子程序等实现相应的功能。
字符图形程序设计的重点在于加强学生对BIOS中断10的学习,了解该中断的相应功能,感受中断调用给汇编程序带来的方便。
通过编写汇编语言,实现字符图形的显示,让学生加深了对汇编程序理论课程的理解,更加了解汇编语言的应用,并且能够按要求编写程序,从而提高学生的汇编语言知识,更进一步地了解了汇编语言,通过本次设计,可以让学生深刻体会到中断调用的功能,可以提高我们的动手能力,培养我们对编程及学习的兴趣。
通过编写程序使我们对指令的应用更加熟练。
同时,也使我们对MASMDIT软件和DOS命令有了更多的学习和了解。
目的在于培养我们的自主学习能力和动手能力,提高我们的编程水平。
二、字符图形显示的基本原理
本程序是显示由多个字符组成的图形的程序,将多个字符定义在一个字符图形表里。
字符图形表包括每个字符的ASCII码、属性以及在显示图形中的相对位移量,应注意的是,每个字符的位置由前一个字符的位置决定。
这个字符图形表由这4个参数组成。
字符图形表中的第一个字节“94”是组成图形的字符数,编写程序时需要将每个字符的ASCII码和属性以及显示的位置放入相应的寄存器中,然后发出显示命令,94个字符都显示出来后,我们就可以看到“元旦”的图形了。
为了清晰地看到每一个字,需要延时,程序中编写了延时子程序。
此外,程序中还有清屏子程序和移动子程序,通过适当的改变延时时间,可实现图形的移动。
三、软件设计
1、总体设计
首先,定义了一个字符图形表“元旦”,设置的字符的类型为DB即为字节类型,字符的ACSII码为03H,显示出来的图形为心形,设置字符的属性为122。
显示完整个字符图形表共需要102行代码,设置初始字符所在的位置为相对于光标位置的(-2,1)位置,前面的-2表示的是列坐标,而后面的1表示的是行坐标。
此后的代码的行列坐标都是相对于前一字符的相对位置,如列坐标的1表示的是向下移动一位,列坐标的-1表示的是像上移动一位,列坐标的0则表示纵向不发生移动。
同理,横坐标的1表示的是向右移动一位,横坐标的-1表示的是像左移动一位,横坐标的0则表示横向不发生移动。
此为数据段的内容。
然后定义了一个堆栈段,开辟了大小为2000字节的空间。
接下来则是代码段的内容,包括初始
化DS的内容、设置图形方式、设置背景颜色、设置彩色调板、清屏、延时、按任意键退出等内容。
2、主模块及子模块说明
主模块是一个主程序,在这个程序中首先设置显示方式、背景颜色、调色板,然后调用清屏子程序CLEAR-SCREEN,为接下来的图形显示做好准备,然后设置好初始行列坐标后,再调用移动子程序MOVE-SHAPE来显示字符,然后调用INT21h的7h号中断功能,使得从键盘输入q字符时,退出程序运行。
第一个子模块是CLEAR-SCREEN子程序,他的功能是清理屏幕,为接下来字符显示准备条件,第二个子模块是MOVE-SHAPE,它通过循环和行列坐标的控制来依次显示字符图形,为功能实现部分。
3、程序流程图设计
4、各模块源程序设计
下面是整体的代码,各个子模块在程序中加以注释。
DATASEGMENT
CARDB94;定义字符
DB02H,122,-5,3
…
DB02H,122,0,-1
CHAR_CNTDW?
POINTERDW?
LINE_ONDB?
COL_ONDB?
DATAENDS
STACKISEGMENT
DB2000DUP(?
)
STACKIENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACKI
MAINPROCFAR;定义过程
PUSHDS
SUBAX,AX;清0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVAH,0;0号功能调用,设置显示模式
MOVAL,0;显示模式的属性为320*2004色
INT10H;10号中断调用,BIOS对荧幕及显示器所提供的服务程式
MOVAH,0BH;0B功能调用,设置调色板,背景色或边框
MOVBH,0;设置颜色
MOVBL,2;颜色
INT10H
MOVAH,0BH
MOVBH,01;选择调色板
MOVBL,00;调色板00
INT10H
CALLCLEAR_SCREEN;调用清屏子程序
LEADI,CAR
MOVDH,10
MOVDL,2
CALLMOVE_SHAPE
MOVAH,8;8号功能调用,无回显的字符的输入
INT21H;中断21
CMPAL,71H
JZEXIT;标志位结果为0转移
JBNEXT;无符号数低于时转移
NEXT:
CMPAL,51H
JZEXIT
MAINENDP
CLEAR_SCREENPROCNEAR;清屏子程序
PUSHAX;保护现场
PUSHBX
PUSHCX
PUSHDX
MOVAH,6;6号功能调用,初始化屏幕
MOVAL,0;清窗口
MOVCH,0;窗口的左上角位置(0,0)
MOVCL,0
MOVDH,120;右下角位置(200,120)
MOVDL,200
MOVBH,7;空白区域的缺省属性
INT10H;10号中断调用
POPDX;恢复现场
POPCX
POPBX
POPAX
RET;返回
CLEAR_SCREENENDP
DLY_QRTRPROCNEAR;延时子程序
PUSHCX
PUSHDX
MOVDX,5000
D11:
MOVCX,25000
D12:
LOOPD12;循环25000次
DECDX;DX-1
JNZD11;结果不为0时转移
POPDX
POPCX
RET
DLY_QRTRENDP
MOVE_SHAPEPROCNEAR;擦除子程序
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVAH,0FH;读取显示器模式
INT10H
SUBCH,CH;清0
MOVCL,[DI]
INCDI;DI+1
MOVCHAR_CNT,CX
MOVPOINTER,DI
MOVLINE_ON,DH
MOVCOL_ON,DL
MOV_CRSR:
ADDDH,[DI+2];Y坐标
ADDDL,[DI+3];X坐标
MOVAH,2;用文本坐标下设置光标位置
INT10H
MOVAL,[DI];字符
MOVBL,[DI+1];属性或颜色
PUSHCX
MOVCX,1;重复输出字符的次数
MOVAH,09;在当前光标处按指定属性显示字符
INT10H
POPCX
ADDDI,4
LOOPMOV_CRSR
POPDI
POPDX
POPCX
POPBX
POPAX
RET
MOVE_SHAPEENDP
EXIT:
MOVAH,4CH;终止当前程序并返回调用程序
INT21H
CODEENDS
ENDMAIN
四、程序调试
本程序可以在MASM环境下运行,也可在DOS环境下运行,由于在MASM环境下操作较为简单,因此不做说明。
下面介绍在DOS环境下运行的过程。
1、用MASM命令对程序进行编译
2、用link命令对程序进行连接
3、进入debug,用命令g执行程序
本次设计的思想便是利用字符来拼凑一个图形,调用画图子程序循环的输出不同位置的字符,直到所需的所有字符输出完,图形也就显示出来了。
需要注意的是,每字符的位置由它前一个字符确定。
本程序可以在DOS环境和MASM环境下运行,在DOS环境下运行,首先用MASM命令将源程序.ASM进行编译,生成.OBJ文件;其次,用Link命令进行连接,产生.exe文件;最后进入debug,用-g命令进行调试运行。
值得注意的是,各个阶段产生的目标文件的文件格式不同,因此在输入命令的时候,要注意文件的后缀名。
若是在MASMEDIT软件下运行,则只需点击相应的功能按钮即可。
用MASMEDIT软件运行的界面友好,视觉效果相对于DOS界面要好看。
五、心得体会
选择这个题目时,第一感觉是不知道从哪里下手。
以前所做的汇编实验,多是对存储器,寄存器的内容进行处理,而这次字符图形显示。
看着老师给的提示,我也不是很明白这个程序的最终成果到底是什么样子的。
定义字符列表是干什么用的呢?
以前从没有碰到过关于定义列表的东西啊?
带着这些疑问,我先是问了老师,老师说用很多个字符拼成一个图形,所以要定义一个字符列表来存放组成图形的每个字符,及其相应的属性。
有了一个大概的框架,了解了程序设计的目的,我着手就容易多。
利用网络资源我搜到了一个显示“中国北京”的源程序。
通过对该程序的分析,了解了这个程序实现字符图形显示的大概流程,及设计的相关功能模块。
这样,我在写某些功能模块时,就借鉴了网上下下来的源程序。
通过课程设计,我领悟到我们应该有一个缜密的编程思想,在编程过程中,首先要对整体程序有一个初步的框架构想,然后根据所学的知识,活用指令,能够使程序更加精简,这就要求我们对指令要熟悉。
在日常生活中,可以通过编写一些小的程序,来熟悉指令的使用和记忆。
在设计过程中也遇到了一些困难,通过和老师、同学的讨论和学习,最终程序得以完成,所以,在完成每一件事情时,不能忽略团队的力量,应当吸取各人的优势,来使自己更加完善。
对于本次课程设计我受益匪浅,很感谢老师和同学的帮助。
参考文献
1、李敬兆.《8086/8088和arm核汇编语言程序设计》.合肥:
中国科技大学出版社
2、沈美明,温冬婵编著.《IBM—PC汇编语言程序设计(第二版)》.北京:
清华大学出版社出版
3、沈美明,温冬婵,张赤红编著.《IBM—PC汇编语言程序设计实验教程》.北京:
清华大学出版社出版
4、钱晓捷.新版汇编语言程序设计[M].北京:
电子工业出版社,2006
5、卜艳萍,周伟.汇编语言程序设计教程.北京:
清华大学出版社,2007
6、宋人杰,牛斗.汇编语言程序设计.北京:
清华大学出版社,2008
7、王爽.汇编程序设计语言.北京:
清华大学出版社,2008
设计总结:
从选择课题开始,经历了收集资料,总体设计,详细设计,调试等阶段。
在每个阶段都要求的阶段性成果,同时也深深感到书本知识和实践的差距,如果没有这实践的经历,书本知识永远都只是书本知识,会因为没有实践的验证和巩固而渐渐遗忘。
只有将学到的知识用到实践,知识才能真正意义上被掌握,被发挥作用。
总的来说,在知道本次设计要实现什么功能后,目标还是很明确的。
在咨询老师的帮助下,以及在网上查看相关资料,这次课程设计做得比较顺利。
通过本次课程设计,我基本掌握了怎样运用汇编语言去设计字符图形,并制作出相应的流程图。
此外,加强了我对MASM软件的熟悉与使用。
另外,因为我的笔记本系统不支持doc全屏显示,但是通过对中断及显示方式的进一步查阅和了解,我解决了这个问题。
很感谢老师,在图形坐标的制作上我遇到了点困难,但通过研究所查找的资料和对源程序的分析,基本上可以定义正确的字符图形表。
整个课程设计的过程,是一个不断学习、不断实践的过程,从而提高了我们的编程能力和程序开发思想,也提高了我们自主学习的能力。
指导教师评语:
课程设计成绩:
指导教师签名:
年月日