霓虹灯显示程序设计.docx
《霓虹灯显示程序设计.docx》由会员分享,可在线阅读,更多相关《霓虹灯显示程序设计.docx(35页珍藏版)》请在冰豆网上搜索。
霓虹灯显示程序设计
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.用汇编语言编写一个霓虹灯的模拟显示程序;
2.在屏幕上动态显示”新年快乐”,按蓝—绿—黄---红---白闪烁变化,按“q”键退出;
时间安排:
1月3日-----1月5日查阅资料及方案设计
1月5日-----1月7日编程
1月7日-----1月9日调试程序
1月9日-----1月10日撰写课程设计报告
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
1设计内容及要求
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.用汇编语言编写一个霓虹灯的模拟显示程序;
2.在屏幕上显示你的中文名字或其它文字,按某种规律闪烁变化,按“q”键退出;
3.撰写课程设计说明书。
内容包括:
摘要、目录、正文、参考文献、附录(程序清单)。
正文部分包括:
设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。
2程序原理分析
采用系统提供的BIOS功能调用中的int10h显示功能,定义AH=0,AL=13将屏幕输出设置为320X200,256色图形方式。
利用AH=12些点功能,通过写ASCII码,来组成文字,其中ASCII码的位置可由行数和列数的二维坐标确定,由定义的区域内开始,行向下自增1,列向右自增1,逐列写ASCII码,然后编写程序段实现内存地址与屏幕坐标之间的联系。
然后采用直接往显卡的内存映射地址中写入数据,用来控制屏幕输出的颜色。
文字的闪烁同样可以通过清屏程序和擦除程序同时作用来实现。
3主程序流程图
程序的设计思路如下:
图3-1程序流程图
4程序主要模块功能分析
4.1名字显示功能模块
设计方案首先采用BIOS功能调用将屏幕输出设置为320X200,256色图形方式(vga)。
它使用了256色的调色板。
4.1.1vga简介
VGA(VideoGraphicsArray)是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。
标准的VGA显卡包含256KB的VRAM(VideoRandomAccessMemory,显存),对于8086该内存区域映射于主内存的地址区域为0x000A0000-0x000BFFFF,显然有0xBFFFF–0xA0000=0xA0000,即655360字节,或640KB。
典型地来说有以下地址:
0xA0000——EGA/VGA图形模式(64KB)
0xB0000——单色文字模式(2KB)
0xB8000——彩色文字模式和CGA相容模式(2KB)
4.1.2256色调色板
模式0x13有一个256色的调色板。
在该模式下的视频内存存储调色板的索引号。
视频设备根据内存中的索引号,在内存地址对应的屏幕位置上描绘色彩。
例如通过调色板色彩布局图知,0代表黑色,1代表蓝色,4代表红色,255代表白色,其余依次类推。
4.1.3视频显示模式设置
我们可以通过调用BIOS中断0号功能设置视频显示模式,具体的设置如下图所示:
功能:
设置显示模式
入口参数:
AH=00H
AL=显示模式
显示模式列表:
显示模式显示模式属性
00H40×2516色文本
01H40×2516色文本
02H80×2516色文本
04H320×2004色
05H320×2004色
06H640×2002色
07H80×252色文本
08H160×20016色
09H320×20016色
0AH640×2004色
0BH保留
0CH保留
0DH320×20016色
0EH640×20016色
0FH640×3502色(单色)
10H640×3504色
11H640×4802色
12H640×48016色
13H320×200256色
那么模式设置的代码可以如下编写:
movah,0
moval,13h
int10h
4.3文字显示
利用子程序plotpixel在屏幕的相应坐标上绘制规定的颜色,即可得到一定的图形。
那么绘制文字就由plotpixel子程序按照文字图形扫描得到。
;-----------------------;
;plotnameatlocation
;(x=bx,y=ax)anddl=color
;andsi=字模首地址
;-----------------------;
plotnameproc
pushax
pushcxN
pushdxY
pushbx
N
movcx,totalbyteY
lop1:
cmpbyteptrds:
[si],'_’
jnzbranch1
movdl,0
jmpgoalN
branch1:
cmpbyteptrds:
[si],'X'Y
jnzbranch2
movdl,1
adddl,[colorchange]
jmpgoal
branch2:
incax
popbx
pushbx
jmpgoal2
goal:
callplotpixel
incbx
goal2:
incsi
looplop1
popbx
popdx
popcx
popax
ret
plotnameendp
图4-2文字显示
4.4清屏子程序
同样的道理,可以得到清屏的代码:
;---------------------------;
;clearthewholescreen
;cl=color
;---------------------------;
clrsrcproc
pushdx
movdl,cl;dx=2pixels
movdh,cl
movcx,0
xordi,di
A1:
movwordptres:
[di],dx
incdi
incdiN
inccxY
cmpcx,32000;320*200/2
jlA1Y
popdx
ret
clrsrcendp
图4-3清屏程序流程
4.5文字动画效果
利用子程序plotname的输入参数dl,可以轻松地控制绘制文字的颜色,那么使用不同颜色隔一段时间绘制同一坐标时便可以产生闪烁的效果了。
利用子程序plotname的输入参数bx,ax可以轻松地控制绘制文字的位置,那么使用不同的bx,ax值将文字描绘到不同位置,并插入清屏子程序clrscr,以及与延时程序delay相结合使用,便可以产生动画效果了。
图4-4文字的颜色变化
5程序调试
在WINXP操作系统下,在MFPCI98软件中编入80x86汇编程序,用MASM5.0编译,进行汇编、连接、运行操作。
对编译时出现的错误进行调试。
我在编译时容易出现遗漏对应指令的错误,如进行CALL指令调用子程序时,容易遗漏在CALL后的RET指令,导致运行时出现错误图形。
还有在调用INT10H功能时,读光标,置光标还有显示字符串指令时,对寄存器AX,BX,DX,CX,BP的数据传送应根据光标起始位的行列坐标需求来确定数据的传送,才能达到要求的图形显示效果。
6课程设计总结
本次课程设计要求我们用汇编语言编写一个霓虹灯的模拟显示程序,这对于我们来说有一定的考验。
首先,要实现题目要求的功能,我们必须寻找一种最为简便的方法,从思路上去简化,然后在编程过程中需要注意程序的调用和程序的条理问题。
一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序,调试程序中,学习了汇编语言的整个调试过程,更加容易的找出程序的错误处了
其次在编写图形或文字的时候我们可以直接运用ASCII码先转换,然后设定程序进行读取,如此可以省去繁杂的程序并避免不必要的错误。
如此大大简化了程序,提高了速度。
通过此次课设,我更加了解了自身的不足,程序编写的不熟练以及操作的不简便浪费了很多时间,对课本以外的知识了解的很少,对软件的运行也不够熟练等。
但总的来说,自己还是进步较大,能够基本独立完成此次课设并学到了很多相关知识。
参考文献
[1]沈美明,温冬禅编著.IBM-PC汇编语言程序设计.第二版.北京:
清华大学出版社,2001
[2]周佩玲,吴耿峰,万炳奎编著.十六位微型计算机原理接口及其应用.合肥:
中国科学技术大学出版社,1995
[3]艾德才编著.Pentium/80486实用汇编语言程序设计.北京:
高等教育出版社,2000
[4]谭浩强编著.计算机硬件技术基础.北京:
电子工业出版社,2004
[5]李继灿编著.新编16-32位微型计算机原理及应用.北京:
清华大学出版社,1997
[6]邹逢兴编著.计算机硬件技术基础.北京:
高等教育出版社,2001
[7]邹逢新等编著.微型计算机原理及其应用典型题解析与实战模拟.长沙:
国防科技大学出版社,2001
[8]周佩玲,彭虎,傅忠谦编著.微机原理与接口技术.北京:
电子工业出版社,2007
附录源程序代码
DATASSEGMENT
addrbufdw0,0
colorchangedb0
ledb'$'
db'******$'
db'*****$'
db'*****$'
db'******$'
db'******$'
db'******$'
db'******$'
db'******$'
db'*****$'
db'*****$'
db'*******$'
db'********$'
db'**********$'
db'********$'
db'*******$'
db'******$'
db'*****$'
db'****$'
db'*****$'
db'*****$'
db'****************************************$'
db'*********************************************$'
db'*********************************************$'
db'********$'
db'*******$'
db'*******$'
db'******$'
db'*******$'
db'*******$'
db'*********$'
db'***********$'
db'**********$'
db'********$'
db'*********$'
db'**************$'
db'********************$'
db'***************************$'
db'**************$'
db'*********$'
db'******$'
db'****$'
db'***$'
db'***$'
db'**$'
db'**$'
db'**$'
db'**$'
db'**$'
db'*$'
totalbyteequ$-le
kuaidb'$'
db'*$'
db'**$'
db'****$'
db'****$'
db'*****$'
db'*****$'
db'*****$'
db'*******$'
db'**********$'
db'***************$'
db'***********************$'
db'************************$'
db'*****************$'
db'*********$'
db'*********$'
db'*********$'
db'*********$'
db'*********$'
db'*********$'
db'*********$'
db'****************************$'
db'********************************$'
db'************************************$'
db'*************$'
db'***********$'
db'**********$'
db'********$'
db'********$'
db'*********$'
db'*******$'
db'******$'
db'******$'
db'*****$'
db'******$'
db'***********$'
db'*********$'
db'******$'
db'*****$'
db'**$'
db'**$'
db'****$'
db'*****************************************************$'
db'*******************************************************$'
db'**********$'
db'$'
db'$'
db'$'
db'******$'
db'************$'
db'**********$'
db'******$'
db'*$'
niandb'$'
db'**$'
db'***$'
db'***$'
db'***$'
db'***$'
db'**$'
db'**$'
db'**$'
db'***$'
db'*****$'
db'******$'
db'********$'
db'*********$'
db'********$'
db'******$'
db'******$'
db'******$'
db'******$'
db'******$'
db'*******$'
db'******$'
db'*******$'
db'**********************************************$'
db'**********************************************$'
db'***********$'
db'*******$'
db'*******$'
db'*******$'
db'*******$'
db'********$'
db'*********$'
db'************$'
db'***************$'
db'**************$'
db'*********************$'
db'**********************$'
db'***********************$'
db'*******$'
db'******$'
db'******$'
db'******$'
db'******$'
db'*****$'
db'****$'
db'****$'
db'****$'
db'****$'
db'****$'
db'****$'
db'**$'
db'**$'
db'*$'
xindb'$'
db'*$'
db'**$'
db'**$'
db'***$'
db'***$'
db'**$'
db'****$'
db'******$'
db'********$'
db'*****$'
db'*********************************$'
db'**************************************$'
db'***********************************$'
db'*******$'
db'****$'
db'*****$'
db'****$'
db'*****$'
db'***$'
db'**************$'
db'****************************$'
db'**********************************$'
db'***************$'
db'********$'
db'**************$'
db'***************$'
db'***************$'
db'***************$'
db'************$'
db'*************$'
db'***************$'
db'***************$'
db'************$'
db'***************************$'
db'************************************$'
db'***************************************$'
db'***************$'
db'*************$'
db'****************$'
db'********************$'
db'******************$'
db'*************$'
db'************$'
db'*********$'
db'*********$'
db'*********$'
db'******$'
db'*****$'
db'***$'
db'**$'
db'*$'
totalbytesequ$-xin
DATASENDS
STACKSSEGMENT
db100dup(0)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
movax,DATAS
movds,ax
movax,STACKS
movss,ax
;修改中断向量表中的int9中断
cli
movax,0
moves,ax
pushes:
[9*4]
popds:
[0]
pushes:
[9*4+2]
popds:
[2]
movwordptres:
[9*4],offsetint9
moves:
[9*4+2],cs
sti
;设置输出屏幕的显示模式320X200,256色图形方式
movax,0A000H
moves,ax
movah,0
moval,13h
int10h
;clearthescreen
movcx,0
callclrsrc
deadlop:
movax,0
movbx,0
movcx,45
move1:
movsi,offsetxin
callplotname
deccx
cmpcx,0
jzlast1
movdx,1
calldelay
pushcx
movcx,0
callclrsrc
popcx
incax
addbx,2
jmpmove1
last1:
movax,50
movbx,0
movcx,50
move2:
movsi,offsetnian
callplotname
deccx
cmpcx,0
jzlast2