模拟“霓虹灯”汇编语言程序设计

  • 格式:doc
  • 大小:910.50 KB
  • 文档页数:53

课程设计题目模拟“霓虹灯”汇编语言程序设计学院专业班级姓名指导教师2012年1月13日目录摘要 (1)1 设计内容介绍 (2)2 方案论证 (3)3 程序原理分析 (4)3.1程序中的字体属性定义 (4)3.2程序中用到的BIOS内的中断功能 (4)3.3程序中用到的DOS功能调用 (5)4 主要模块与程序设计 (7)4.1程序流程图 (7)4.2文字显示模块 (11)4.3颜色变化模块 (13)4.4竖形条纹显示模块 (13)4.5竖形条纹移动与清屏模块 (14)4.6按ESC退出模块 (15)4.7延迟功能模块 (16)5 程序调试 (18)5.1调试工具 (18)5.2调试过程 (18)5.3结果分析 (18)结束语 (21)参考文献 (22)附录源程序代码 (23)摘要霓虹灯是日常生活中最为常见的灯饰,它装点了晚上,使城市的夜景变得如此的美丽,极大地丰富了人们的生活。

通过汇编语言编写程序,实现模拟霓虹灯的显示与闪烁,可以很方便的打到需要的效果。

汇编语言中的INT 10H号中断提供了设置显示模式,设置颜色模式,设置光标位置,按指定属性显示字符等功能号,可以显示汉字与字母,同时还提供了初始化屏幕和滚动屏幕等功能号,通过擦除子程序以及清屏子程序的配合,从而达到让霓虹灯闪烁的功能。

正确编排文字组成点的坐标,颜色以及ASCII码值,就可以达到需要显示的文字,合理运用INT 10H号中断的功能号,正确调用擦除子程序和清屏子程序就可以达到预期的效果。

关键词:霓虹灯中断子程序显示闪烁1 设计内容介绍汇编语言是用指令的助记符、符号地址、标号等书写程序的语言,实际上是机器语言的一种符号表示,主要特点是可以使用助记符来表示机器指令的操作码和操作数,可以用标号和符号来代替地址、常量和变量。

汇编语言是能够利用计算机所有硬件特性进而直接控制硬件的唯一语言。

汇编语言的使用范围很广,文字显示只是其中很简单的一项。

本次课程设计采用DOS和BIOS功能调用,采用25×80的彩色图像显示方式。

先运用绘图软件生成文字图片文件,再用ASCII Art Studio软件将编辑好的图片文件转换为ASCII字符画,并设定ASCII码的颜色值。

ASCII码对应字符的位置由行数与列数的二维坐标确定。

其中行向上则减,向下则增;列向左则减,向右则增。

在程序的数据定义区定义所要输出的文字的位形图,每行数据段定义组成文字的一个点。

其中包含组成文字的字符、颜色、横坐标、纵坐标。

文字的变色是通过同一个字的不同颜色版本去覆盖当前的版本以及清屏、擦除程序实现的。

文字的闪烁则是通过将颜色属性的八位二进制数的最高位置实现的。

通过比较键盘字符输入ESC来判断是否结束程序。

2 方案论证虽然整个大的程序框架很难构思,但是将程序分割成几个功能模块则可以很轻松的得出。

(1)文字显示可以使用坐标纸写点的方法,或者使用ASCII Art Studio 软件将文字的图片转换成ASCII字符画。

用坐标纸定位每个文字点的坐标工作量非常大,而且很容易算错,运用字符画软件则很轻松的提取文字的字符画格式,方便快捷,易于修改。

(2)在检测退出模块中必须先检测键盘是否有输入,否则当程序运行到这的时候将会暂停等待键盘输入之后才会继续运行,无法实现霓虹灯的闪烁功能。

3 程序原理分析3.1 程序中的字体属性定义本程序采用的是彩色字符显示,在显示彩色文本时,属性字节能够选择前景和背景的颜色。

每个字符可以选择16种颜色中的一种,背景色有8种颜色可以选择。

图3-1是16色文本方式显示的属性字节。

表3-1列出了16色字符方式颜色的组合。

图3-1 16色方式下的属性字节表3-1 16种颜色的组合3.2程序中用到的BIOS内的中断功能(1)02H号功能调用功能:用文本坐标下设置光标位置入口参数:AH=02HBH=显示页码DH=行(Y坐标)DL=列(X坐标)出口参数:无功能:读光标处的字符及其属性入口参数:AH=08HBH=显示页码出口参数:AH=属性AL=字符(3)09H号功能调用功能:在当前光标处按指定属性显示字符入口参数:AH=09HAL=字符BH=显示页码BL=属性(文本模式)或颜色(图形模式) CX=重复输出字符的次数出口参数:无(4)0FH号功能调用功能:读取显示器模式入口参数:AH=0FH出口参数:AH=屏幕字符的列数AL=显示模式BH=页码3.3程序中用到的DOS功能调用(1)01H号功能调用功能:从键盘输入一个字符输入参数:无输出参数:AL=ASCII码功能:检查标准输入设备上是否有字符可读,该输入操作可被重定向输入参数:AH=0BH输出参数:AL=00H——无字符可读;FFH——有字符可读(3)4CH号功能调用功能:返回操作系统4CH调用:MOV AH,4CHINT 21H4 主要模块与程序设计4.1 程序流程图4.1.1 主程序流程图主程序流程图如下:图4-1 主程序流程图4.1.2 子程序流程图本程序显示的文字为英文字母,字母都用不同颜色的版本先写一次,然后竖形条纹扫过,条纹扫过时字母被覆盖,条纹扫过后开始显示颜色变化后的字母,然后条纹再扫过,一直这样循环。

因此,子程序有文字显示子程序、竖形条纹显示子程序、擦除子程序,对应的流程图分别如图4-2、4-3、4-4所示。

文字显示子程序流程图如图4-2所示。

图4-2 文字显示子程序流程图竖形条纹显示子程序流程图如图4-3所示。

图4-3 竖形条纹显示子程序流程图擦除子程序流程图如图4-4所示。

图4-4 擦除子程序流程图4.2 文字显示模块如何使用ASCII码显示文字是这次课程设计的关键之处,为了达到霓虹灯的效果,我采用各种字符组合来组成文字的形状,为了达到更美观的效果,在这里,借助一个字符画转换软件,名字为ASCII Art Studio,该软件是用来创建ASCII字符画的软件,可以像使用画笔一样创建 ASCII 字符画。

转换完成的文字效果如图4-5所示。

图4-5 转换为字符画的文字对应显示屏幕上的每个字符,在存储器中又连续的两个字节表示,一个字节保存ASCII码,另一个字节保存字符的属性。

在屏幕上处理字母、数字以及一些字符图形称为文本方式。

在文本方式下,属性字节对单色显示和彩色显示都是有效的。

在彩色显示器里,如 CGA、EGA、VGA 等,常用一个字节 ( 8 个位 ) 来表示文字颜色和背景颜色,通常以第 0~3 位表示文字本身颜色;第 4~6 位表示背景颜色,背景颜色只有上表左栏的 8 种而已;第 7 个位,表示是否闪烁,0 表示不闪烁,1 表示闪烁。

每个字符由四种属性组成,第一项为字符种类,如61h代表字符“a”,第二项为字符的颜色,如Oah代表绿色,第三项为字符相对于前一个字符的行坐标,第四项为该字符对于上一个字符的列坐标,这样只要定义了第一个字符在屏幕中的位置,那么就能将整个文字显示出来。

例如: A db 147db 'q',04h,0,8db 'N',04h,0,1db 'y',04h,1,-2这段程序是字母A的位形图程序的一部分。

其中'q'为A的第一个点转换为ASCII码的值,在屏幕上会显示q;04h为其颜色属性,且为红色不闪烁;(0,8)为这个点的坐标,第一个为行坐标,第二个为列坐标。

这个点也是字母A组成点的基准坐标,其余点的设置与此点类似。

,向上则行自减1,向下则行自增1,向左则列自减1,向右则列自增1。

每写出一个点后,该点的坐标变回基准坐标(0,0)。

本程序中写点是按照从左到右、从上到下的顺序写的,直至写完所有的点。

显示字母的的过程如下面程序段所示,其中前三句是将字母位型图的地址送给寄存器,dh和dl分别表示字母的起始的第一个点在屏幕上的行列的坐标,call指令用于子程序调用,分别调用move_shape1和 Amust_2子程序,进行读点和写点。

lea di,Amov dh,3mov dl,4call move_shape1call Amust_2在move_shape1子程序中,char_cntl是指字符,pointer1表示颜色,line_on1为行坐标,col_on1为列坐标。

写点的程序在子程序Amust_2,Amust_21中类似,程序段如下:mov cx,char_cnt1mov di,pointer1mov dh,line_on1mov dl,col_on1Aplot_next0:add dh,[di+2]add dl,[di+3]mov ah,2int 10hmov al,[di]mov bl,[di+1]push cxmov cx,1mov ah,09int 10hpop cxadd di,4应当说明的是,程序中 cx寄存器入栈又出栈。

入栈是为了保存cx中的数值,将寄存器cx空出来,作为计数用,随即出栈的目的是重新将已经保存的cx 中的值保存到 cx中,作为循环次数用。

程序中到 int 10h为止都是写点的程序。

add di,4是为写下一个点做准备,直至写完。

4.3 颜色变化模块颜色变化功能实际上就是将文字用其他颜色重新写一遍,因此可实现文字颜色变化,本程序用的是重新定义数据段的方法,将每个字符重新定义,还有一种方法是使用函数,将每个字符代表字符颜色的部分同时加减一个数,便可实现变色功能。

4.4 竖形条纹显示模块数据段中竖形条纹只定义了6个点,为了能够有足够的宽度将汉字覆盖,因此要将db 40h,0ah,1,0与db 02ah,0ceh,-1,0两个点重复写19次,形成够宽的条纹。

主程序中Acount0先定义为了19,写完19个“@”后,Acount0重新赋值19,再将02ah对应的字符“*”写19次,构成完整的竖形条纹。

模块的核心算法程序如下:cmp al,40hje Aexitx0cmp al,02ahje Aexitx0jmp Aexitx1Aexitx0: dec Acount0jne Aplot_nextmov Acount0,194.5 竖形条纹移动与清屏模块在每次写完竖形条纹以后,由dec col_on1实现起始点列坐标的的自减1,从而实现竖形条纹的从右向左移动。

模块的核心程序如下:add dh,[di+2]add dl,[di+3]cmp dl,2je Aleftmov ah,2int 10hmov ah,8int 10hcmp al,40hje Aexitx2cmp al,02ahje Aexitx2jmp Aexitx3Aexitx2: dec Acount0jne Aexitx3mov Acount0,19Aexitx3: cmp Acount1,1je Aexit0mov al,' 'mov bl,03hjmp Aexit7Aexit0: mov al,' 'mov bl,0Aexit7: push cxmov cx,1mov ah,9int 10hpop cxcmp Acount0,19jne Aerase_nextadd di,4loop Aerase_nextdec col_on1屏幕的擦除是通过竖形条纹与“空格”的比较,相同则不变,不同则将次字符改为“空格”实现的。