ITEEDU

 实际上刚刚讨论过的这些清屏方法都有些繁琐,下面介绍的这个方法就可以说十分简单快捷了。在前面讨论显示模式的时候曾经提到过一般的显示卡能支持多种显示模式,程序需要使用何种显示模式是可以选择的。这里需要再补充一点,那就是当程序设定一种新的显示模式后,BIOS中断服务程序会自动的清除整个屏幕,这样看来重置显示模式也是一种清屏方法。设置显示模式可以使用10H中断的0号功能:

功能号:00H
用 途:设置显示模式
参 数:AL = 显示模式号
调 用:INT 10H
返 回:无

当系统启动之后,DOS默认的显示模式是模式3,也就是80列25行的字符模式。所以如果编程重新选择显示模式3,那么就会有"清屏"的效果而且DOS的显示模式没有改变。下面给出了一个试验程序:

C:\ASM\>DEBUG [Enter]
-a100[Enter]
09DF:0100 mov ax,0003	;利用10H中断的0号功能
09DF:0103 int 10		;将屏幕设置为03模式
09DF:0105 ret
09DF:0106[Enter]

键入"G=100"马上就会看到屏幕被清除的干干静静,短短两条指令就有立竿见影的效果。不过可不要高兴的太早,有一个很重要的问题被忽略了,这个问题并不隐蔽,那就是给出的试验程序对"当前"的显示模式作了假定。

的确,DOS确实工作在模式3下,但这并不意味着其他的程序都使用显示模式3,很明显如果我们编制一个图形程序那么使用上面这一小段程序清屏就会乱套。这提醒我们在设置显示模式之前应该查出当前的显示模式,而后将当前显示模式作为新的显示模式进行设置,这样才可以保证清屏后显示模式不变。好在10H中断提供了一个功能调用专用于查出当前显示模式:

功能号:0FH
用 途:查询当前显示模式
参 数:无
调 用:INT 10H
返 回:AL=当前显示模式号
AH=每行显示的字符数
BH=当前的显示页号

 下面给出的程序才是真正的清屏程序:

C:\ASM\>DEBUG[Enter]
-a100[Enter]
13C6:0100 mov ah,0f	;选择10H中断0FH功能
13C6:0102 int 10	;获得当前的显示模式
13C6:0104 mov ah,0	;选择10H中断的0号功能
13C6:0106 int 10	;重新设置当前的显示模式
13C6:0108
-g=100 104[Enter]    AX寄存器中有10H中断返回的当前显示模式
AX=5003 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0104 NV UP EI PL NZ NA PO NC
13C6:0104 B400 MOV AH,00

0FH功能在AL寄存器中返回了当前的显示模式,AH寄存器中返回的是当前可显示的列数。我们可以利用0号功能重置显示模式以达到清屏的目的。以下的跟踪过程不再给出,大家可以自己跟踪程序观察结果。

四条指令即可完成清屏,确实简捷,而且无论在字符模式还是图形模式下这种方法都有效。不过优缺点总是相对的,用这种方法无法完成清窗口的功能。
至此我们已经学习了八项Video BIOS的功能调用,还有两项很重要的功能和两项近似没用的功能我们没有谈到,在本节的最后,我们将共同研究这四块未知领域。第一个要讨论的问题就是"显示页"。