ITEEDU

说实在的,如果单就"清屏幕"这个问题而言解决的办法有很多,恐怕大家都能想到这个方法那就是在屏幕上显示25行空格就可清除屏幕上所有的内容。下面这个程序就是据此思路编写的:

C:\ASM\>DEBUG [Enter] 
-a100[Enter]
09F9:0100	BA0000	MOV	DX,0000	;设置新的光标位置
09F9:0103	B700	MOV	BH,00	;BH寄存器装入显示页号
09F9:0105	B402	MOV	AH,02	;利用10H中断的02功能
09F9:0107	CD10	INT	10		;设置光标位置
09F9:0109	B98000	MOV	CX,0080	;显示80个字符
09F9:010C	B020	 MOV AL,20	;准备显示空格
09F9:010E	B307	MOV	BL,07	;显示黑底白字正常属性
09F9:0110	B409	MOV	AH,09	;利用10H中断的09功能
09F9:0112	CD10	INT	10		;显示空格
09F9:0114	FEC6	INC	DH		;光标行号加1
09F9:0116	80FE19	CMP	DH,19	;已经到屏幕底部了吗?
09F9:0119	72E8    JB	103		;未到屏幕底部,转0103继续
09F9:011B 	CD20 	INT  20		;结束程序 

好象问题就这么简单,难道只有这一种方法吗?下面我们就要来学习新的解决办法。

大家对于屏幕的"滚动"并不陌生,我们所面对的屏幕只能显示25行文字,如果显示的文字多于25行,那么位于屏幕最顶端的字符就会滚到屏幕外面。其实屏幕的上下滚动是完全可以用程序控制的,而且我们不仅可以控制整个屏幕的滚动,还能让屏幕上某一部分的内容上下滚动。方法也很简单,只不过是10H中断的两个功能调用而已:

功能号:06H/07H
用 途:窗口内容向上/向下滚动
参 数:AL=要滚动的行数(若是0将清窗口)
BH=填入新行的属性
CH=滚动窗口的左上角行号
CL=滚动窗口的左上角列号
DH=滚动窗口的右下角行号
DL=滚动窗口的右下角列号
调 用:INT 10H
返 回:无

两个功能调用滚动的方向相反,如果我们从给出的这两个功能调用的参数上加以分析,我们可以大概推测出这两个功能调用所能完成的工作:

(1)用这两个功能调用既可以滚动屏幕上的一个窗口,也可以滚动整个屏幕,只需将窗口的左上角定为(0,0),将右下角定为(79,25);
(2)滚动的行数可以任意(由AL寄存器决定);
(3)在清除后的屏幕上显示文字会产生色彩,而不仅仅是单纯的黑色(由BH寄存器决定)。

这只是简单的设想,能否实现还要靠编程验证。让我们编写下列程序: