null第15章 屏幕处理高级特性 第15章 屏幕处理高级特性 15.1 属性编码
15.2 BIOS中断10H
15.3 闪烁、反白和卷动
15.4 其他DOS输入输出处理
15.5 BIOS INT 16H的键盘处理
15.6 扩充功能键 15.1 属 性 编 码 15.1 属 性 编 码 单色显示器有4K字节的存储器,即显示缓冲区,只能显示黑白字母、数字和方块图形。显示模式为文本模式时,显示屏幕为80列、25行,即80×25个字符。4K字节存放每个屏幕字符和字符的属性编码,属性编码将确定显示反白、闪烁、高亮度等。
null 彩色/图形显示卡,有文本模式和图形模式两种工作模式。在文本模式下显示屏幕有两种格式:80×25和40×25,显示卡上有16K字节的存储器,即显示缓冲区。在屏幕显示80×25时,显示缓冲区分成了4个屏幕页(0~3);显示40×25时,显示缓冲区分成了8个屏幕页(0~7)。系统预置的显示页号数是0,但你也可以使用显示缓冲区的其他页。
null 单色和彩色的属性编码在文本模式的情况下,将决定每一个被显示字符的特性。对应屏幕上的每个字符位置有两个存储器字节:一个是被显示字符的ASCII码,另一个就是显示字符的属性字节。属性字节中的编码不同,决定了被显示字符的特性不同。在单色文本模式下,属性字节确定字符是否闪烁、高亮度、反白显示等。所以,属性的不同编码会使字符以不同的效果在屏幕上显示,单色显示的属性编码如图15-1所示。
null图15-1 单色属性字节null RGB字母分别占一个位,各代表彩色显示器的红、绿、蓝三色。位7(BL)设定闪烁,位3(I)设定高亮度。前景指显示的字符,一般是白色;背景是黑色。表15-1列出了前景、背景编码的组合模式。 null表15-1 背景、前景编码组合模式null 彩色显示器并不提供加底线的功能。但是,这一位被用来当作选用蓝色前景,因此显示变为蓝字黑底。表15-2给出了一些典型的单色文本显示模式下的属性编码和对应的显示效果。 null表15-2 典型单色属性编码值及显示效果 null 这些属性都适用于文字的单色及彩色显示,下一章将介绍如何选定某一特定颜色。当程序设定某一属性之后,它就一直保持这个属性,直到另一个属性改变它为止。例如,将属性设为00H,此字节将完全不显示。
15.2 BIOS中断10H 15.2 BIOS中断10H BIOS是IBM PC机上提供的一系列基本输入/输出系统功能模块;每一种功能模块完成某种特定的输入/输出功能,它可以使程序编制人员不必了解硬件I/O接口的特性,依靠直接调用某个功能模块,就可以完成相应的I/O设备的控制和管理。调用前只需在指定寄存器中设置入口参数,使用中断调用指令INT n,便能得到希望的结果或返回参数。null 其中BIOS的INT 10H完成的是对屏幕的操作。本节将对中断INT 10H的部分功能进行介绍,使用INT 10H之前,先将其功能号预置在AH中。
(1) AH=00:设置显示模式。
AL中预置显示模式字,无返回参数。AL的设定如下:
00 40×25 黑白模式
01 40×25 彩色文本模式 16色
02 80×25 黑白模式
03 80×25 彩色文本模式 16色
04 320×200 彩色图形模式 4色null05 320×200 单色图形模式 黑白
06 640×200 单色图形模式 黑白
07 80×25 单色文本模式 黑白
0D 320×200 彩色图形EGA 16色
0E 640×200 彩色图形EGA 16色
(EGA为增强型图形界面显示卡。)
null例如,设置显示模式为320×200彩色图形模式:
MOV AH,00 ;设置显示模式
MOV AL,04 ;320×200 彩色图形模式
INT 10H ;调用BIOS 10 H中断
null (2) AH=01:文本模式下设置光标大小。
ASCII码字符集中没有光标。计算机用硬件控制光标,并有一些特殊的INT处理为它服务。可以使用INT 10H来调整光标的高度。寄存器CH (位4~0)确定光标的上限位置(开始扫描线),寄存器CL(位4~0)确定光标的下限位置(结束扫描线)。你可以在上限和下限之间来调整光标的大小,0/13适用于单色及增强型图形显示器,0/7适用于大部分的彩色显示器。
null 入口参数:AH=01,CH=光标开始扫描线,CL=光标结束扫描线,无返回参数。
例如,将光标设置为极限(最大):
MOV AH,01 ;要求设置光标大小
MOV CH,00 ;光标开始扫描线
MOV CL,13 ;光标结束扫描线
INT 10H ;调用BIOS 10H中断
null 这时光标就像一个闪烁的方块。只要在范围内,你就可以任意地调整光标大小,例如,04/08,03/10等等。光标将一直保持这种状态,直到下一次改变它为止。CH/CL=12/13(单色)或CH/CL=6/7(彩色)可将光标还原成正常状态。图形模式下如需要,可自行模拟光标。
null (3) AH=02:设置光标位置。
这个操作可以将光标设置在屏幕的任何位置。它是依行、列的坐标而定的。一般显示缓冲区使用0页,但在80行模式下,页数可以是0~3中的任意一页。
入口参数:AH=02,BH=页号,DH=行号,DL=列号,无返回参数。
null 例如,将光标移动到第0页的第3行、第 8列:
MOV AH,02 ;设置光标位置
MOV BH,00 ;第0页
MOV DH,03 ;第3行
MOV DL,08 ;第8列
INT 10H ;调用BIOS 10H中断
该程序段将使光标移动到指定位置。
null (4) AH=03:读当前光标位置。
利用这个功能可以找到当前光标所处的位置,以及光标的大小。
入口参数:AH=03,BH=页号。
返回参数:DH=行号,DL=列号,CH=光标开始扫描线,CL=光标结束扫描线。
例如,读取第0页光标当前位置:
MOV AH,03 ;要求读当前光标位置
MOV BH,00 ;第0页
INT 10H ;调用BIOS 10H中断null 该程序段执行完后,在DX中得到光标的位置,DH为行号,DL为列号,在CX中得到光标的大小,CH为扫描开始线,CL为结束扫描线。
(5) AH=04:读光笔位置。
null (6) AH=05:选择显示页。
入口参数:AH=05,AL=页号,无返回参数。
例如:
MOV AH,05 ;选择显示页
MOV AL,02 ;要显示的页号(0~7)
INT 10H ;调用BIOS 10H中断
在40列的模式中,可以选择编号为0~7的显示缓冲区显示页;在80列的模式中,可以选择编号为0~3的显示页。
null (7) AH=06:窗口上卷。
当一个程序的显示内容向下已超过屏幕的底部,下一行应绕到顶部再开始,解决的方法是将屏幕向上滚动。
入口参数:AH=06,AL=上卷行数,窗口底部为空白输入行。若AL=0表示窗口为空白。CH、CL=卷动的左上角行、列号;DH、DL=卷动的右上角行、列号;BH=空白输入行的属性(正常、反白、闪烁还是设定色彩)。无返回参数。 null例如:
MOV AX,0603H ;向上卷3行
MOV BH,07 ;正常属性
MOV CX,0410H ;从左上角第4行、第10H列
MOV DX,1130H ;至右上角第11H行、第30H列
INT 10H ;调用BIOS 10H中断
该程序段执行完后,第4行、第10H列到第11H行、第30H列的窗口上卷3行。
null (8) AH=07:窗口下卷。
入口参数:AH=07,其他的和06号功能相同。此时窗口顶部为输入行。无返回参数。
(9) AH=08:读当前光标位置的字符和属性。
此操作可在文字或图形模式下读取显示区的字符和属性。
入口参数:AH=08,BH=页号。
返回参数:AL=读出的字符,AH=读出的字符属性。
null 例如,读取第0页当前光标位置的字符和属性:
MOV AH,8 ;要求读取字符和属性
MOV BH,0 ;第0页
INT 10H ;调用BIOS 10H中断
此操作将返回的字符存在AL中,而属性放在AH中。在图形模式下,AL中返回的不是光标处字符的ASCII码,而直接反映字符点阵,所以要确定是什么字符,必须将该点阵与字符点阵发生器内的各字符逐一比较,如无字符AL=0。
null (10) AH=09:在当前光标位置写出字符(包括属性和ASCII码)。
入口参数:AH=09,BH=页号,AL=要显示的字符的ASCII码,BL=字符属性(文本或图形模式下,其功能包括闪烁、反白等),CX=要显示字符数的重复次数。无返回参数。
例如:
MOV AH,09 ;要求显示
MOV AL,要显示的字符
null MOV BH,页号
MOV BL,属性或色彩
MOV CX,要写的字符次数
INT 10H ;调用BIOS 10H
AL中存放的是一个要显示的字符,可以重复出现多次。CX中的值决定AL中字符重复出现的次数,显示不同的字符需要重复执行,但并不会使光标前移。图形模式下,利用BL来定义前景颜色。如下例所示,在品红背景下,显示五个浅绿色闪烁的星号(彩色文本模式下)。
nullMOV AH,09 ;要求显示
MOV AL,‘*’ ;显示‘*’
MOV BH,0 ;0页
MOV BL,0DAH ;彩色显示属性
MOV CX,05 ;重复5次
INT 10H ;调用BIOS 10H
null(11) AH=0AH:在当前光标位置写字符(属性不改变)。
模式0A与09的不同之处是模式0A不能设定属性。
入口参数:AH=0AH,其余同09号功能。
MOV AH,0AH ;要求显示
MOV AL,char ;所要显示的字符
MOV BH,page# ;页数
MOV CX,repetition ;重复5次
INT 10H ;调用BIOS 10H null (12) AH=0EH:写字符并移动光标位置。
此操作会自动地使光标前进一格,并转到下一行,将屏幕向上卷动。
设定AH为0EH,要显示的字符放在AL中,BL中存放前景颜色(图形模式),要显示的页号存放在BH中(文字模式)。铃声(07H)、退位(08H)、换行(0AH)和回车(0DH),会影响此模式的正常执行。
入口参数:AH=0EH,DX=要写的字符,BH=页号,BL=前景颜色(图形模式下),无返回参数。
null (13) AH=0FH:读当前显示状态。
入口参数:AH=0FH。
返回参数:AL=当前显示模式,AH=屏幕显示列数,BH=当前页号。
(14) AH=13H:写字符串。
本功能有4 个子功能,在各个子功能里均需ES:BP指向一个字符串,CX中存放字符串的长度,BH中存放字符串的显示页号,DH和DL中分别存放起始位置行、列。例如:
null MOV AH,13H
MOV AL,子功能号 ;子功能号:0~3
MOV BH,页号
LEA BP,地址 ;在ES:BP位置的字符
MOV CX,字符串长度
MOV DX,屏幕起始位置
INT 10H
null 0子功能:显示字符串,统一属性在BL中,光标不移动位置。
1子功能:显示字符串,统一属性在BL中,光标移动到显示字符串末尾。
2子功能:显示字符串(包含属性字节),光标不移动位置。
3子功能:显示字符串(包含属性字节),光标移动到显示字符串末尾。
15.3 闪烁、反白和卷动15.3 闪烁、反白和卷动 例15.1所示程序的功能是从键盘接受名字,并将它显示在屏幕上。但是,本程序以反白的模式显示提示语句,依照正常的模式接受输入名字,并且在同一行40列的位置,以反白和闪烁的模式把名字显示在屏幕上。显示格式如下:
Name?Francis Bacon Francis Bacon
0列 40列 null 为了控制光标的位置,程序中定义了变量ROW来控制列的增加,而变量COL是为了在显示提示语句和名字的时候可以水平地移动光标,因为INT 10H不会自动使光标向前移动。本程序使屏幕由上向下显示到20行为止;以后,每个增加的提示语句都将使屏幕上卷一行。
在输入方面,子程序D10INPT使用DOS的INT 21H实现。
null例15.1 一个闪烁、反白和卷动的综合实例程序。
源程序清单如下:
TITLE NMSCROLL(EXE) REVERSE VIDEO,BLINKING,SCROLLING
; ---------------------
STACKSG SEGMENT PARA STACK 'STACK'
DW 32 DUP(?)
STACKSG ENDS
; ---------------------
null DATASG SEGMENT PARA 'DATA'
NAMEPAR LABEL BYTE ;名字参数表
MAXNLEN DB 20 ;名字最大长度
ACTNLEN DB ? ;实际输入字符长度
NAMEFLD DB 20 DUP(' ') ;名字
COL DB 00
COUNT DB ?
PROMPT DB 'NAME?'
ROW DB 00
DATASG ENDS null ; ---------------------
CODESG SEGMENT PARA 'CODE'
BEGIN PROC FAR
ASSUME CS:CODESG, DS:DATASG, SS:STACKSG, ES:DATASG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AXnull MOV ES,AX
MOV AX,0600H
CALL Q10CLR ;清屏
A20LOOP:
MOV COL,0 ;设置COL为0
CALL Q20CURS ;设置光标位置
CALL B10PRMP ;显示提示符
CALL D10INPT ;输入名字
null CMP ACTNLEN,0 ;是否有名字
JNE A30 ;有,转A30
MOV AX,0600H
CALL Q10CLR ;没有,清屏
RET
A30:
CALL E10NAME ;显示名字
JMP A20LOOP
BEGIN ENDP
null; --------DISPLAY PROMPT:显示提示--------
B10PRMP PROC NEAR
LEA SI,PROMPT ;取提示符地址
MOV COUNT,05
B20:
MOV BL,70H ;反白
CALL F10DISP ;调用显示
INC SI ;取名字中下一字符
INC COL ;取下一屏COLnull CALL Q20CURS
DEC COUNT ;名字长度减1
JNZ B20 ;循环N次
RET
B10PRMP ENDP
; --------ACCEPT INPUT OF NAME:输入名字--------
D10INPT PROC NEAR
MOV AH,0AH
LEA DX,NAMEPAR
INT 21H
RETnullD10INPT ENDP
; ------DISPLAY NAME WITH BLINKING REVERSE VIDEO:显示名字------
E10NAME PROC NEAR
LEA SI ,NAMEFLD ;取名字首字符地址
MOV COL,40 ;设置屏幕COL
E20:
CALL Q20CURS ;设置光标
MOV BL,0F0H ;闪烁、反白null CALL F10DISP ;调用显示
INC SI ;取名字中下一字符地址
INC COL ;取下一屏COL
DEC ACTNLEN ;名字长度减1
JNZ E20 ;循环N次
CMP ROW,20 ;是否是屏幕底部?
JAE E30 ;不是
INC ROW
null RET
E30: MOV AX,0601H ;是
CALL Q10CLR ;清屏
RET
E10NAME ENDP
null; --------DISPLAY CHARACTER:显示字符--------
F10DISP PROC NEAR ;入口参数在BL中
MOV AH,09 ;显示
MOV AL,[SI] ;取名字中字符
MOV BH,00 ;页号
MOV CX,01 ;字符数是1
INT 10H
RET
F10DISP ENDP null; --------CLEAR SCREEN:清屏--------
Q10CLR PROC NEAR ;入口参数在AX中
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
RET
Q10CLR ENDP
null ; --------SET CURSOR ROW/COL:设置光标位置--------
Q20CURS PROC NEAR
MOV AH,02
MOV BH,00
MOV DH,ROW
MOV DL,COL
INT 10H
RET
Q20CURS ENDP
CODESG ENDS
END BEGIN15.4 其他DOS输入输出处理15.4 其他DOS输入输出处理 DOS操作系统为用户提供了许多可以直接调用的子程序,称为系统功能调用。使用系统功能调用的一般过程为,把功能号放入AH寄存器,设置入口参数。然后,执行中断INT 21H。系统功能调用的类型为20H~3FH,由于在现有的PC机上,28H~3FH类型号尚未使用,所以只使用了20H~27H类型号,其中大部分由DOS调用,只有少量的允许用户调用。 null 其中21H号功能调用是面向用户的,具有对键盘、显示器、磁盘、打印机和异步通讯进行操作的多种功能,共有80多个子程序功能供用户使用,21H使用各子程序功能的调用模式是一样的,调用的格式是:
入口参数→相关的寄存器
程序功能号→AH
INT 21H
null 例如,显示字符串—— 09号功能调用,在第8章中就已介绍并使用。下面介绍几种较为常见的功能调用。
(1) AH=00:停止程序运行,无返回参数。
(2) AH=01:有返回参数的键盘输入。
此功能会返回两种情况其中的一种参数:若AL的值不为0,表示输入的为字符的ASCII码,例如,字母或数字。反之,若AL的值为0,则表示输入的是一个特殊的功能键,例如,Home、F1或 PgUp等。
null 无入口参数;返回参数:输入字符的ASCII码→AL。
功能:等待用户从键盘上输入一个字符键,并对字符键进行检查,如果为Ctrl+Break,则退出命令行;否则,将字符的ASCII码送给AL,并将该字符显示在屏幕上。例如,执行程序段:
MOV AH,01
INT 21H
若在键盘上输入字符‘S’,则在AL中得到字符‘S’的ASCII码53(十六进制),并将字符‘S’显示在屏幕上。
null (3) AH=02:在屏幕上显示一个字符。
入口参数:被显示字符的ASCII码→DL。无返回参数。
功能:将DL中的字符显示在屏幕上。
例如,在屏幕上显示‘*’。
MOV AH,02
MOV DL,‘*’ ;或 MOV DL,2AH (2AH为‘*’的ASCII码)
INT 21Hnull (4) AH=05:打印机输出。
入口参数:要输出字符的ASCII码→DL。
功能:打印出要输出的字符。
(5) AH=07:无返回参数的直接键盘输入。
该功能基本上同AH=01的功能,不同的是输入的字符不会在屏幕上显示;对于Ctrl+Break请求,不响应。
null (6) AH=08:无返回参数键盘输入。
该功能基本上同AH=01的功能,但输入的字符不会在屏幕上显示,响应Ctrl+Break。
例如,将从键盘上输入的一个字符打印机输出。
MOV AH,08
INT 21H
MOV DL,AL
MOV AH,05
INT 21H
null (7) AH=0BH:检查键盘输入状态。
此功能返回的值将存放在AL中,若AL的值为FF(十六进制),表示输入的字符是有效的,否则AL的值为0。此功能常与功能01、07及08连用。
15.5 BIOS INT 16H的键盘处理15.5 BIOS INT 16H的键盘处理 BIOS INT 16H是对键盘进行的BIOS软中断调用。它有以下7个主要功能,功能号在AH中,作为入口参数。
null (1) AH=00:读取一个字节。
该功能会将一个由键盘输入的ASCII码读入AL中,即取出缓冲区队列首字符的ASCII码送AL,扫描码送AH。缓冲区后续字符前移,若缓冲区中无内容,将等待。若被输入的字符是特殊键,例如Home、F1等,AL的值会被设为00。本功能不会自动返回字符到屏幕上。
null (2) AH=01:决定是否能够读入字节。
本功能将0标志位清0(ZF=0)为入口参数,用来表示能够读入字节;出口的AX 内容同上,但不同的是,只对缓冲区的队首读出而不是取出,既不改变缓冲区内容,也不等待,并设置ZF=0作为已获得字符(已按过键)的标志。如队列为空,则ZF=1。
null (3) AH=02:读取特殊功能键状态。
该功能将返回参数存放在AL中,AL中各二进制位状态含义如下:
位7(Ins)=1 表示正处于插入状态
位6(Caps)=1 表示处于字母大写状态
位5(Num)=1 表示处于数值键状态
位4(Scroll)=1 表示设定为Scroll Lock状态
位3(Alt)=1 表示Alt+Shift被按下
位2(Ctrl)=1 表示Ctrl+Shift被按下
位1(ShiftL)=1 表示“左移”被按下
位0(ShiftR)=1 表示“右移”被按下null(4) AH=05:键盘写。
本功能允许对键盘缓冲区的队尾直接写入。
入口参数:CL=ASCII码,CH=扫描码。
(5) AH=10H:读扩展键盘(101/102键)。
(6) AH=11H:取扩展键状态。
(7) AH=12H:取扩展移位键状态。
15.6 扩 充 功 能 键15.6 扩 充 功 能 键 整个键盘可分为三种基本的类型:
(1) 字符键,例如字母A~Z,数字0~9,%、$、#等等。
(2) 扩充功能键,例如Home,End,退格(Backspace),回车(Enter),Del,Ins,PgUp,PgDn等。
null (3) 控制键,例如Alt,Ctrl及Shift等。它们只能和其他键连用。
扩充功能键实质是在请求一个操作,强迫这些键去完成某一特定的工作。作为一个程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
员,你可以任意设定它们的任务,例如当Home键按下时,将光标移至屏幕的左上角位置,或者当End按下时,将光标移至屏幕上文字的结束位置。你可以很方便地用程序设计它们,来完成一个新的控制。
null 键盘上的每一个键都有一个特定的扫描码,编号为1(Esc)~101(Del)。
依照这些扫描码,程序可以确定任意一个被按下键的来源。例如,请求键盘输入一个字符,就要做如下操作,将AH寄存器设为0,并调用BIOS INT 16H,即
MOV AH,00 ;请求从键盘输入
INT 16H ;调用BIOS
null 此调用的返回参数有两种,根据你所键入的是字符键或扩充键来决定。对于一个字符,例如字母“A”,键盘传送返回给计算机会有两种信息:
(1) 在AL中存放“A”的ASCII码(41,十六进制)。
(2) 字母“A”的扫描码(1E,十六进制)存放在AH中。
null 若所键入的是扩充功能键,例如Ins,键盘也会传送两种信息:
(1) AL寄存器设为0。
(2) Ins的扫描码(52,十六进制)存放在AH中。
因此,当执行完INT 16H指令后,你可以测试AL的值。如果是0,该请求是扩充功能键码;如果不是0,该请求操作是传送一个字节。 null下面的程序是针对扩充功能键而设计的:
MOV AH,00 ;要求输入
INT 16H ;调用BIOS
CMP AL,00 ;判断是扩充功能键吗?
JZ EXIT ;是,跳到EXIT