霓虹灯显示程序设计详解文档格式.docx
《霓虹灯显示程序设计详解文档格式.docx》由会员分享,可在线阅读,更多相关《霓虹灯显示程序设计详解文档格式.docx(37页珍藏版)》请在冰点文库上搜索。
典型地来说有以下地址:
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×
02H80×
04H320×
2004色
05H320×
2004色
06H640×
2002色
07H80×
252色文本
08H160×
20016色
09H320×
0AH640×
0BH保留
0CH保留
0DH320×
0EH640×
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:
X'
Y
jnzbranch2
movdl,1
图4-1文字显示程序流程
adddl,[colorchange]
jmpgoal
branch2:
incax
popbx
pushbx
jmpgoal2
goal:
callplotpixel
incbx
goal2:
incsi
looplop1
popdx
popcx
popax
ret
plotnameendp
图4-2清屏程序流程
图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
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'
******$'
*****$'
******$'
******$'
******$'
******$'
******$'
*****$'
*****$'
*******$'
********$'
**********$'
********$'
*******$'
******$'
*****$'
****$'
*****$'
****************************************$'
*********************************************$'
********$'
******$'
*********$'
***********$'
**********$'
********$'
*********$'
**************$'
********************$'
***************************$'
**************$'
*********$'
******$'
****$'
***$'
**$'
**$'
*$'
totalbyteequ$-le
kuaidb'
$'
**$'
*****$'
*******$'
**********$'
***************$'
***********************$'
************************$'
*****************$'
*********$'
*********$'
****************************$'
********************************$'
************************************$'
*************$'
***********$'
*********$'
******$'
******$'
***********$'
*********$'
******$'
****$'
*****************************************************$'
*******************************************************$'
**********$'
******$'
************$'
**********$'
niandb'
***$'
*********$'
********$'
******$'
*******$'
**********************************************$'
***********$'
*******$'
********$'
*********$'
************$'
***************$'
**************$'
*********************$'
**********************$'
***********************$'
*******$'
******$'
xindb'
*$'
******$'
********$'
*********************************$'
**************************************$'
***********************************$'
**************$'
****************************$'
**********************************$'
***************$'
********$'
**************$'
***************$'
***************$'
***************$'
************$'
*************$'
***************$'
***************$'
************$'
***************************$'
************************************$'
***************************************$'
***************$'
*************$'
****************$'
********************$'
******************$'
*************$'
************$'
*********$'
*********$'
*****$'
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]
[9*4+2]
[2]
movwordptres:
[9*4],offsetint9
moves:
[9*4+2],cs
sti
设置输出屏幕的显示模式320X200,256色图形方式
movax,0A000H
movah,0
moval,13h
int10h
clearthescreen
movcx,0
callclrsrc
deadlop:
movbx,0
movcx,45
move1:
movsi,offsetxin
callplotname
deccx
cmpcx,0
jzlast1
movdx,1
calldelay
pushcx