⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 汇008.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:

可用的显示模式,请参阅附录3中的中断10H之功能00H中所列。

1)、文本显示方式

文本显示方式是指以字符为最小单位的显示方式,每个字符都是以矩形块形式显示的。在BIOS ROM中存有多种不同大小的字符集,主要的显示字符集大小为:8×8(标准)、8×14和8×16等。

在常用的文本显示模式(模式3)下,屏幕被划分成25行,每行可显示80个字符,所以,每屏最多可显示2000(80×25)个字符。为了便于标识屏幕上的每个显示位置,我们就用其所在行和列来表示之,并规定:屏幕的左上角坐标为(0, 0),右下角坐标为(24, 79)。

在显示字符时,用一个字节存储该字符的ASCII码,用另一个字节存储的显示属性,即:显示颜色。彩色显示器的字符显示属性定义如图8.6所示,有关颜色值的定义,请参阅附录6中的表4。



图8.6 字符显示属性的定义

存储内容与显示位置的对应关系如图8.7所示。
 

图8.7 存储内容与显示位置的对应关系示意图
 

由上面的叙述可知:在80×25的文本显示模式下,满屏可显示2000个字符,也就需要4000个字节来存储一屏的显示信息。
2)、图形显示方式

图形显示是目前最常用的一种显示方式,也是Windows操作系统的默认显示方式。在该显示方式下,我们可以看到优美的图象、VCD、浏览丰富多彩的网页等。

图形显示的最小单位是象素,对每个象素可用不同的颜色来显示。所以,在显示缓冲区内记录的信息是屏幕各象素的显示颜色。

由于各种图形显示模式所能显示的颜色和象素是不同的,它决定了显示缓冲区的存储方式也是不同的。下面给出三个具体的图形显示模式及其存储方式,通过它们可看出各种显示模式在显示缓冲区存储方式上的明显差异。

(1)、4色320×200图形显示模式

由于每个象素只能是四种颜色之一,而四种情况用2位二进制就可表示,所以,一个字节可表示4个象素的显示颜色,存储一行上的所有象素信息就需要80个字节。

在具体存储过程中,它又把偶数行象素和齐数行分开来存储。偶数行和齐数行的象素总数各有32000个,也都需要8000个字节来存储,并规定:偶数行象素从0B800:0000H开始存储,齐数行象素从0B800:2000H开始存储。该显示模式的存储形式如图8.8所示。



图8.8 显示缓冲区存储方式示意图

(2)、16色640×480图形显示模式

640×480图形显示模式共有307200个象素,每个象素可选用16种颜色,它需要用4位二进制来表示。该显示模式在存储显示信息时,把该4位分在四个位平面P1、P2、P3和P4上,所以,位平面Pi(i=1,2,3,4)共有307200个二进制位,即有38400个字节。其显示缓冲区的存储形式如图8.9所示。



图8.9 显示缓冲区存储方式示意图

由图8.9可看出:若要改变某个象素的显示颜色,则需要在每个位平面上修改其对应的二进制位。所以,若用操作显示缓冲区的方法来改变象素的颜色,那么编程将困难得多。在屏幕上显示一个点,必须遵循以下步骤:

读入要改变的内存单元,把位平面信息装入显示卡;
通过图形地址寄存器(GAR)和位屏蔽寄存器(BMR)选择并寻址到其二进制位;
寻址并设定映像屏蔽寄存器(MMR)为0FH,在对应象素地址填入0(黑色)来清除象素的原有颜色;
通过MMR设定该象素当前所要颜色;
通过修改包含显示信息的内存单元来写象素。

对于该显示模式下,改变象素方法的详细描述和例子,请参阅参考书籍[2]、[4],或其它有关技术资料,在此不再进一步展开叙述。

若用BIOS中断10H之功能0DH/0CH来读/写象素,则它可屏蔽掉各种显示模式的差异,用同样的参数完成同样的功能。所以,在此建议:使用系统中断的方法来实现对图形象素的操作。

(3)、256色320×200图形显示模式

表达256种不同颜色需要8位二进制,即一个字节。在该模式下,其显示缓冲区的存储方式是非常简单的,即:第一个字节存储第一个象素的颜色,第二个字节存储第二个象素的颜色,以此类推,所以,存储满屏象素所需要的字节数为:320×200×1=64000。其显示缓冲区的存储方式如图8.10所示。

从上面三种不同图形显示模式的介绍,不难看出:各种显示模式在显示缓冲区存储方式上的明显差异,操作象素方法的难易程度相差也很大,所以,再次建议:程序员不要用直接操作显示缓冲区的办法来达到改变显示象素的目的,最好是通过BIOS内的中断功能来实现相应的功能,这样,所编写的程序能很方便地适应不同的图形显示模式。
 

图8.10 显示缓冲区存储方式示意图
 2、显示缓冲区

显示缓冲区是用来记录屏幕显示信息的。在文本显示方式下,这些显示信息包括:每个显示字符的ASCII码及其显示属性,如图8.7所示。在图形显示方式下,显示缓冲区内存储每个象素的显示颜色。

在图8.7中,我们并没有给出具体的段地址,只用"XXXX"来表示其段地址。在常用的VGA显示方式下,计算机系统规定:

文本显示方式下,单色显示器的显示缓冲区段地址为0B000H;
文本显示方式下,彩色显示器显示缓冲区段地址为0B800H;
图形显示方式下,其显示缓冲区段地址为0A000H。

3、DOS功能中的屏幕输出

屏幕输出是最常用的一种输出形式,DOS操作系统提供了几种实现屏幕输出的功能调用。INT 21H中的相关功能如下:

02H——显示的字符
06H——控制台的输入/输出:当DL≠0FFH,表示显示字符
09H——在屏幕上显示一个字符串

有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅附录3之字符功能调用类。

4、BIOS中的屏幕操作功能

BIOS系统提供了中断10H来实现各种屏幕处理功能。其具体的功能如下:

 00H——设置显示器模式 01H——设置光标形状 
02H——设置光标位置 03H——读取光标信息 
05H——设置显示页 06H、07H——初始化或滚屏(向上滚屏和向下滚屏) 
08H——读光标处的字符及其属性 09H——在当前光标处按指定属性显示字符 
0AH——在当前光标处显示字符 0CH——写图形象素 
0DH——读图形象素 0EH——在Teletype模式下显示字符 
0FH——读取显示器模式 10H——颜色 
13H——在Teletype模式下显示字符串 

有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅附录3之显示服务。

5、屏幕输出的举例

例8.2 用直接写屏方式在屏幕第5行、第10列以黄色(0EH)显示字符串"Hello"。

解:在文本显示方式下,每行显示80个字符,每个字符占2个字节,所以,显示一行需要160个字节。若在第m行、第n列位置显示字符,则该位置所对应存储单元的偏移量为:m×160 + n×2。

 .MODEL SMALL
.DATA
 Yellow EQU 0EH
 MSG1 DB "Welcome..."
 Count EQU $-MSG1
.CODE
 .STARTUP 
 MOV AX, 0B800H 
 MOV ES, AX ;彩色显示器的显示缓冲区段地址 
 MOV DI, 5 
 IMUL DI, 160 ;5行所跳过的显示存储单元 
 MOV CX, 10 
 SHL CX, 1 ;10列所跳过的显示存储单元 
 ADD DI, CX ;第5行、第10列之前所跳过的所有显示单元 
 MOV CX, Count 
 LEA SI, MSG1 ;CX:字符个数,SI:显示字符首地址 
 MOV AH, Yellow ;设置显示属性,即显示颜色 
 .REPEAT 
  LODSB ;取显示字符 
  STOSW ;向显示缓冲区设置显示字符和属性 
 .UNTILCXZ 
 .EXIT 0 
 END 

例8.3 用“霓虹灯”的显示方式显示字符串"Hello",按ESC键时结束程序的运行。

解:显示解答

例8.4 编写一个输入密码的程序,该程序的具体要求如下:

1、每输入一个字符,显示字符"#"表示之;
2、密码最多只有10个字符,多余的按键被丢弃;
3、若输入的字符串为"HELLO",则以蓝色显示"Welcome…",否则,以闪烁、亮红色在显示"Invalid Password"。

解:显示解答

例8.5 在256色320×200的图形显示模式下,从屏幕最左边向最右边,依次画竖线(从顶到底),线的颜色从1依次加1。要求用中断调用的方法来画线。

解:显示解答

例8.6 在256色320×200的图形显示模式下,从屏幕顶到屏幕底依次画横线(从最左边到最右边),线的颜色从1依次加1。要求用直接操作显示缓冲区的方法来画线。

解:显示解答
3、键盘中断的处理过程

当用户按键时,键盘接口会得到一个代表该按键的键盘扫描码,同时产生一个中断请求。键盘中断服务程序先从键盘接口取得按键的扫描码,然后根据其扫描码判断用户所按的键并作相应的处理,最后通知中断控制器本次中断结束并实现中断返回。

 若用户按下双态键(如:Caps Lock、Num Lock和Scroll Lock等),则在键盘上相应LED指示灯的状态将发生改变; 
 若用户按下控制键(如:Ctrl、Alt和Shift等),则在键盘标志字中设置其标志位; 
 若用户按下功能键(如:F1、F2、…等),再根据当前是否又按下控制键来确定其系统扫描码,并把其系统扫描码和一个值为0的字节存入键盘缓冲区; 
 若用户按下字符键(如:A、1、+、…等),此时,再根据当前是否又按下控制键来确定其系统扫描码,并得到该按键所对应的ASCII码,然后把其系统扫描码和ASCII码一起存入键盘缓冲区; 
 若用户按下功能请求键(如:Print Screen等),则系统直接产生一个具体的动作。 

有关键盘中各种单键、组合键的扫描码及其相应的ASCII码,请参阅本书的附录5。

4、DOS功能中的键盘输入

键盘输入是一种最常用的输入方式,所以,在DOS操作系统中,提供了能实现各种键盘输入的功能(Windows操作系统中仍然能用)。INT 21H中的相关功能如下:

 01H——带回显的键盘输入 06H——控制台的输入/输出:当DL=0FFH,表示键盘输入 
07H——不回显、不过滤的键盘输入 08H——不回显的键盘输入 
0AH——键盘输入字符串 0BH——检查键盘输入状态 
0CH——清除输入缓冲区的输入功能 

有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅附录3之字符功能调用类。

5、BIOS中的键盘输入

在BIOS系统中,提供了中断16H来实现键盘输入功能。其具体的功能如下:

00H、10H——从键盘读一个字符,输入字符不回显
01H、11H——判断键盘缓冲区内是否有字符可读
02H——读取当前键盘状态字

有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅附录3之键盘服务。

6、直接操作端口的键盘输入

由表8.1可知:键盘输入端口的地址为60H,所以,我们可以用指令IN从该端口读取当前按键的扫描码。

例如:

MOV DX, 60H
IN   AL, DX
7、键盘输入的举例

例8.1 用键盘最多输入10个字符,并存入内存变量Buff中,若按“Enter”键,则表示输入结束。

解:

1、方法1

 .MODEL SMALL 
 CR EQU  0DH ;定义“回车”键的符号名 
.DATA 
 Buff DB  10 DUP(?) 
.CODE 
 .STARTUP 
MOV CX, 0AH 
LEA BX, Buff 
.REPEAT 
 MOV AH, 0H 
 INT 16H ;用BIOS中的中断功能 
 .BREAK .IF AL==CR 
 MOV [BX], AL 
 INC BX 
.UNTILCXZ 
.EXIT    0 
END 

2、方法2

 .MODEL SMALL 
.DATA 
 Buff DB 10, ?, 10 DUP(?) ;注意缓冲区的定义方式 
.CODE 
 .STARTUP 
 LEA DX, Buff 
 MOV AH, 0AH 
 INT 21H ;用DOS中的功能调用 
 .EXIT 0 
 END 
8.3.3 打印输出的中断功能
打印输出是一种硬拷贝输出,也是一种常用的输出形式。随着计算机应用领域的不断扩大,外围设备的重视程度也越来越高。目前,打印机的种类已日益丰富,有针式打印机、喷墨打印机和激光打印机等。从打印色彩来看,既有普通的黑色打印,也有彩色打印。总之,计算机打印输出的品质是越来越高。

1、打印机状态字

打印机状态字记录着打印机的当前工作情况(或状态),它相当于CPU中的程序状态字和键盘状态字。打印机状态字的各位定义如图8.11所示。

若在某个程序中要包含打印功能,那么,程序员可通过打印状态字来了控制打印过程,并向使用者提供各种有用信息。比如:提示使用者“打印机无纸了”或打印机处于脱机状态(Off Line)等。
 

图8.11 打印机状态字节定义
 

2、打印控制命令

在打印时,程序员往往要控制文本的输出格式,比如:换页、换行、字体或字号等。若要实现对打印格式的控制,就必须要知道控制打印机的控制字符和控制命令。一些常用的打印控制字符如表8.3所示。

表8.3 常用的打印控制字符

字符值 功能描述 
09H 水平制表符,跳到下一个制表位置 
0AH 换行 
0CH 换页 
0DH 回车 

打印机还有其它的控制命令,如:ESC命令序列,该序列由字符ESC(其ASCII为1BH)和一些数值组成。表8.4列举了LQ-1600K打印机的几个控制命令。对于其它各类打印机的控制命令,要参阅其使用手册。

表8.4 LQ-1600K打印机的几个控制命令

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -