微机原理课程设计姓名学号显示设计.docx
《微机原理课程设计姓名学号显示设计.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计姓名学号显示设计.docx(53页珍藏版)》请在冰点文库上搜索。
微机原理课程设计姓名学号显示设计
姓名学号显示设计
一、设计概述
本次课程设计采用DOS和BIOS功能调用,采用25×80的彩色图像显示方式。
先在坐标纸上用ASCII码所对应的字符拼出自己的名字和学号,并设定ASCII码的颜色值。
ASCII码对应字符的位置由行数与列数的二维坐标确定。
其中行向上则减,向下则增;列向左则减,向右则增。
程序在数据段中写出所要显示的我名字的位形图,每行数据段定义组成文字的一个点。
其中包含组成文字的字符、颜色、横坐标、纵坐标。
文字的变色是通过同一个字的不同颜色版本去覆盖当前的版本以及清屏、擦除程序实现的。
文字的闪烁则是通过将颜色属性的八位二进制数的最高位置一实现的。
通过比较输入字符与0、Q或q的大小,来实现退出的功能。
二、设计要求
1)利用80x86汇编语言BIOS中断调用的方法,通过字符设计自己的名字及学号,并在显示器上用6种以上的颜色显示出来;
2)姓名与学号可动态切换,且按某种规律闪烁变化,按“q”键退出;
3)可自行设计显示姓名及学号的方案。
三、设计内容
文字显示可采用坐标纸写点的方式,虽然写点的工作量较大,但是便于理解,容易修改。
用相同字体但不同颜色的字符去覆盖对应的字符,只能起到变色的作用。
要实现闪烁还要把每一个点的颜色属性最高位设为1。
退出程序块中,在判断输入字符是否为Q或q之前必须加一段有没有字符输入的程序。
否则,程序运行到判断字符这里,运行窗口就会等在那里,直到输入字符才能继续运行。
这样每次运行到这里程序就会等着,实现不了霓虹灯的连续闪烁。
1.程序流程图
(1)主程序流程图
流程思路:
数据段初始化→调用汉字显示程序,先显示汉字“wu模块”,再显示汉字“wu1模块”→调用竖条纹显示程序,显示运动的条纹→判断是否有字符输入,没有的话,继续往下执行→有字符输入时,判断是否为“Q”或“q”→不为“
Q”或“q”时,转到执行程序段Aagain1→为“Q”或“q”时,退出程序。
主程序流程图如下:
图1学号和姓名显示主程序
(2)子程序流程图
本程序显示的汉字为自己的名字,名字中的每个字都用不同颜色的版本写两次,然后竖形条纹扫过,条纹扫过时汉字被覆盖,条纹扫过后开始显示下一个文字,然后条纹再扫过,一直这样循环。
因此,子程序有汉字显示子程序、竖形条纹显示子程序、擦除子程序,对应的流程图分别如图2、3、4所示。
图2学号和姓名显示子程序流程图
图3竖形条纹显示子程序
图4擦除子程序
2.主要程序段与程序设计分析
(1)程序中用到的BIOS内的中断功能
①02H号功能调用
功能:
用文本坐标下设置光标位置
入口参数:
AH=02HBH=显示页码
DH=行(Y坐标)DL=列(X坐标)
出口参数:
无
②08H号功能调用
功能:
读光标处的字符及其属性
入口参数:
AH=08HBH=显示页码
出口参数:
AH=属性AL=字符
③09H号功能调用
功能:
在当前光标处按指定属性显示字符
入口参数:
AH=09HAL=字符
BH=显示页码BL=属性(文本模式)或颜色(图形模式)
CX=重复输出字符的次数
出口参数:
无
④0FH号功能调用
功能:
读取显示器模式
入口参数:
AH=0FH
出口参数:
AH=屏幕字符的列数AL=显示模式
BH=页码
(2)程序中用到的DOS功能调用
①01H号功能调用
功能:
从键盘输入一个字符
输入参数:
无
输出参数:
AL=ASCII码
②0BH号功能调用
功能:
检查标准输入设备上是否有字符可读,该输入操作可被重定向
输入参数:
AH=0BH
输出参数:
AL=00H——无字符可读;FFH——有字符可读
③4CH号功能调用
功能:
返回操作系统4CH
调用:
MOVAH,4CH
INT21H
(3)主要程序段与程序设计分析
①数据段
本课程设计源程序中的汉字运用写点的方式实现,在数据段的定义中,由组成汉字的点的ASCII码值、颜色、X坐标、Y坐标构成。
例如:
wudb148
db2ah,8ah,0,0
db2ah,8ah,0,1
db2ah,8ah,3,0
这段程序是第一个汉字“李”的位形图,其中2ah为组成“李”字第一个点的ASCII码值,在屏幕上显示为*;8ah为颜色属性,为淡绿色且闪烁;(0,0)为这个点的坐标,第一个为行坐标,第二个为列坐标。
这个点为“李”字组成点的基准坐标,其它点的坐标设置与此点类似。
坐标设置按照矩阵的形式,向上则行自减1,向下则行自增1,向左则列自减1,向右则列自增1。
每写出一个点后,该点的坐标变回基准坐标(0,0)。
本程序中写点是按照从左到右、从上到下的顺序写的,直至写完所有的点。
②写点程序段
首先将汉字位形图的地址送给寄存器,程序如下:
leadi,wu
movdh,12
movdl,20
其中,dh,dl分别对应于所写汉字第一个点在屏幕上显示时的行、列坐标。
然后读取组成点的信息,程序段如下:
movchar_cnt1,cx
movpointer1,di
movwune_on1,dh
movcol_on1,dl
movchar,cx
程序中char_cnt1指字符,pointer1指颜色,wune_on1指行坐标,col_on1指列坐标。
写点的程序在子程序Amust_2,Amust_21中类似,程序段如下:
movcx,char_cnt1
movdi,pointer1
movdh,wune_on1
movdl,col_on1
Aplot_next0:
adddh,[di+2]
adddl,[di+3]
movah,2
int10h
moval,[di]
movbl,[di+1]
pushcx
movcx,1
movah,09
int10h
popcx
adddi,4
应当说明的是,程序中cx寄存器入栈又出栈。
入栈是为了保存cx中的数值,将寄存器cx空出来,作为计数用,随即出栈的目的是重新将已经保存的cx中的值保存到cx中,作为循环次数用。
程序中到int10h为止都是写点的程序。
adddi,4是为写下一个点做准备,直至写完。
③输入Q、q退出程序
movah,0bh
int21h
cmpal,0
jzAagain1
movah,1
int21h
cmpal,'q'
jzexit
cmpal,'Q'
jzexit
jmpAagain1
exit:
movax,4c00h
int21h
本段程序实现了首先判断有没有字符输入,有字符输入再判断是否为Q、q,进而判断是否退出。
若没有jmpAagain1这条语句,输入的字符不是Q、q程序也会结束。
④竖形条纹的显示程序
cmpal,40h
jeAexitx0
cmpal,02ah
jeAexitx0
jmpAexitx1
Aexitx0:
decAcount0
jneAplot_next
movAcount0,11
数据段中竖形条纹只定义了6个点,为了能够有足够的宽度将汉字覆盖,因此要将db40h,05h,1,0与db02ah,05h,-1,0两个点重复写11次,形成够宽的条纹。
主程序中Acount0先定义为了11,写完11个“@”后,Acount0重新赋值11,再将02ah对应的字符“*”写11次,构成完整的竖形条纹。
⑤竖形条纹的移动与擦除程序
自己名字和学号的依次显示是通过竖形条纹的移动覆盖与擦除程序实现的。
Aerase_next:
adddh,[di+2]
adddl,[di+3]
cmpdl,2
jeAleft
movah,2
int10h
movah,8
int10h
cmpal,40h
jeAexitx2
cmpal,02ah
jeAexitx2
jmpAexitx3
Aexitx2:
decAcount0
jneAexitx3
movAcount0,11
Aexitx3:
cmpAcount1,1
jeAexit0
moval,'*'
movbl,03h
jmpAexit7
Aexit0:
moval,'*'
movbl,0
Aexit7:
pushcx
movcx,1
movah,9
int10h
popcx
cmpAcount0,11
jneAerase_next
adddi,4
loopAerase_next
deccol_on1
在每次写完竖形条纹以后,由deccol_on1实现起始点列坐标的的自减1,从而实现竖形条纹的从右向左移动。
屏幕的擦除是通过比较竖形条纹与“*”,相同则不变,不同则将次字符改为“*”实现的。
3.程序运行结果显示
首先以列显示两种版本彩色的“李”字,并且能够闪烁。
图中四个白色方格实际是闪烁功能,按Alt+Enter在全屏下观看,则可看见闪烁。
然后竖形条纹从右向左扫过,覆盖“李”字,开始以行的方式写“珍”字。
最后,同样竖形条纹从右向左扫过,覆盖“珍”字,进而开始显示“098813”。
学号显示完以后,重新开始循环显示自己名字的两个字,直至输入了Q、q程序结束,否则一直循环。
四、程序调试说明和结果分析
1.调试工具
使用汇编语言调试器DEBUG进行调试,DEBUG程序是专门为汇编语言设计的一种调试工具。
它能给DOS提供有力的纠错、跟踪和运行功能,并能检查系统的各个数据。
该工具可以通过单步、设置断点等方法微程序设计者提供一种有效的调试手段。
2.调试过程与结果分析
本程序在调试过程中,遇到了很多自己思考不周的问题。
第一,在没有输入任何字符的情况下,程序运行到字符检测点停了下来,必须输入一个字符让程序继续或结束。
经过检查原来是没有设置判断是否有字符输入的程序,修改后解决了;第二,输入的字符非Q、q时,程序也会结束。
在和Q、q比较的程序段之后、过程终止程序段之前加上jmpAagain1语句,即正常了。
第三,在使用条件转移指令jz时,发现不能生成obj文件,经检查发现jz与要调用的程序距离太远,把二者距离拉近后问题得到解决。
第四,写好程序运行时发现屏幕上显示的汉字严重错位,检查数据段发现有一个点没有定义,重新定义后显示了正确的字符。
真是一个小疏漏造成大问题。
五、心得体会
微机原理与接口技术是一门很有趣的课程,任何一个计算机系统都是一个复杂的整体,学习计算机原理是要涉及到整体的每一部分。
讨论某一部分原理时又要涉及到其它部分的工作原理。
这样一来,不仅不能在短时间内较深入理解计算机的工作原理,而且也很难孤立地理解某一部分的工作原理。
所以,初学《微机原理》时,感觉摸不着头绪。
面对着众多的术语、概念及原理性的问题不知道该如何下手。
在了解课程的特点后,我发现,应该以微机的整机概念为突破口,在如何建立整体概念上下功夫。
可以通过学习一个模型机的组成和指令执行的过程,了解和熟悉计算机的结构、特点和工作过程。
这次微机原理课程设计历时一个星期,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,特别是汇编程序的设计、编写和调试,而且学到了很多在书本上所没有学到过的知识。
,为做课设调试程序还学习安装虚拟机和系统,这在以前是不敢想,熟悉DOS窗口的简单命令操作,以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序流程图出来,但是我开始总觉得这样做没必要,很浪费时间。
但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画流程图是很有必要的。
因为通过程序流程图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。
其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
附录
data_segsegment;定义数据段
wudb148;第一个“吴维林”的位形图
db2ah,8ah,-5,0
db2ah,8ah,0,1;横笔画
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,1,0;竖笔画
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0;横笔画
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,-1,0;竖笔画
db2ah,8ah,-1,0
db2ah,8ah,-1,0
db2ah,8ah,5,-1;横笔画
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,2,1;横笔画
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,-1,7;竖笔画
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,-1;撇笔画
db2ah,8ah,1,-1
db2ah,8ah,-2,2;捺笔画
db2ah,8ah,1,1
db2ah,8ah,1,1
;第一个“维”的位形图
db2ah,8ah,-10,10;绞丝旁
db2ah,8ah,1,-1
db2ah,8ah,1,0
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,1,0
db2ah,8ah,1,-1
db2ah,8ah,1,-1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,2,0
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,-8,5;单人旁
db2ah,8ah,1,-1
db2ah,8ah,1,-1
db2ah,8ah,0,1
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,-6,2;鸟字旁
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,2,0
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,2,0
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,2,0
db2ah,8ah,0,-1
db2ah,8ah,0,-1
db2ah,8ah,0,1
db2ah,8ah,-1,0
db2ah,8ah,-1,0
db2ah,8ah,-1,0
db2ah,8ah,-1,0
db2ah,8ah,-1,0
db2ah,8ah,-1,0
db2ah,8ah,-1,0
;第一个“林”的位形图
db2ah,8ah,0,5;木1
db2ah,8ah,0,1;横笔画
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,-1,-3;竖笔画
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,-5,-1;撇笔画
db2ah,8ah,1,-1
db2ah,8ah,1,-1
db2ah,8ah,-2,4;捺笔画
db2ah,8ah,1,1
db2ah,8ah,1,1
db2ah,8ah,-4,2;木2
db2ah,8ah,0,1;横笔画
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,0,1
db2ah,8ah,-1,-3;竖笔画
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,1,0
db2ah,8ah,-6,0;撇笔画
db2ah,8ah,1,-1
db2ah,8ah,1,-1
db2ah,8ah,1,-1
db2ah,8ah,-3,3;捺笔画
db2ah,8ah,1,1
db2ah,8ah,1,1
db2ah,8ah,1,1
wu1db148;第二个“吴维林”字的位形图
db2eh,8eh,-5,1
db2eh,8eh,0,1;横笔画
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,1,0;竖笔画
db2eh,8eh,1,0
db2eh,8eh,1,0
db2eh,8eh,1,0
db2eh,8eh,0,-1;横笔画
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,-1,0;竖笔画
db2eh,8eh,-1,0
db2eh,8eh,-1,0
db2eh,8eh,-1,0
db2eh,8eh,6,-1;横笔画
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,2,1;横笔画
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,-1,7;竖笔画
db2eh,8eh,1,0
db2eh,8eh,1,0
db2eh,8eh,1,-1;撇笔画
db2eh,8eh,1,-1
db2eh,8eh,-2,2;捺笔画
db2eh,8eh,1,1
db2eh,8eh,1,1
;第二个“维”的位形图
db2eh,8eh,-10,10;绞丝旁
db2eh,8eh,1,-1
db2eh,8eh,1,0
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,1,0
db2eh,8eh,1,-1
db2eh,8eh,1,-1
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,2,0
db2eh,8eh,0,-1
db2eh,8eh,0,-1
db2eh,8eh,-8,5;单人旁
db2eh,8eh,1,-1
db2eh,8eh,1,-1
db2eh,8eh,0,1
db2eh,8eh,1,0
db2eh,8eh,1,0
db2eh,8eh,1,0
db2eh,8eh,1,0
db2eh,8eh,1,0
db2eh,8eh,1,0
db2eh,8eh,-6,2;鸟字旁
db2eh,8eh,0,1
db2eh,8eh,0,1
db2eh,8eh,2,0
db2eh,8eh,0,-1
db2