说实在的,如果单就"清屏幕"这个问题而言解决的办法有很多,恐怕大家都能想到这个方法那就是在屏幕上显示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寄存器决定)。
这只是简单的设想,能否实现还要靠编程验证。让我们编写下列程序: