关于显示分页的情况在本章的前半部分中已有所述,很多项功能调用都要求在BH寄存器中放入显示页号,而且只有"当前"的显示页才会真正出现在屏幕上。这样一来如果程序在其他显示中写入了字符应该如何处理才能在屏幕上看到呢?这就需要使用10H中断的05H功能来设置当前显示页:
功能号:05H
用 途:设定当前显示页
参 数:AL=所选的显示页号
调 用:INT 10H
返 回:无
下面的程序演示了这个功能的应用,我们先在四个显示页中写入不同的信息,然后根据按下的数字键轮换设置四个显示页为当前显示页,这样就可以在屏幕上看到不同的显示内容。
data segment assume ds:data pagemsg db 'Zero PAGE',0 ;定义放入不同显示页中信息 db 'First PAGE',0 db 'Second PAGE',0 db 'Third PAGE',0 data ends code segment assume cs:code main proc far mov ax,data ;初始化DS寄存器 mov ds,ax mov si,offset pagemsg ;SI寄存器指向PAGEMSG mov bl,1 ;显示字符为蓝色 mov bh,0 ;显示页号送入BH寄存器 start: mov dx,0 ;设置光标的位置为(0,0) dispmsg: mov ah,2 ;利用10H中断的02功能 int 10h ;设置光标位置 lodsb ;从字符串中取得一个字符 or al,al ;已经到字符串结尾了吗? jz next_page ;已到结尾,转NEXT_PAGE mov ah,9 ;利用10H中断的09功能 mov cx,1 ;在BH指出的显示页内输出一个字符 int 10h inc dl ;光标所在列号加1 jmp dispmsg ;显示下一个字符 next_page: inc bl ;改变字符属性 inc bh ;选择下一个显示页 cmp bh,4 ;处理所有的显示页了吗? jb start ;未处理所有的显示页,转START继续 swich: mov ah,0 ;等待键盘输入 int 16h sub al,30h ;输入的字符ASCII码减30H jb exit ;若ASCII码小于30H(不是数字键)结束 cmp al,03h ;若ASCII码大于33H(大于数字4) ja exit ;转EXIT退出 mov ah,5 ;利用10H中断的05功能 int 10h ;将当前显示页设置为指定页 jmp swich ;转SWICH继续等待键盘输入 exit: mov ah,4ch ;结束程序 int 21h main endp code ends end main
这四个显示页有什么实际应用价值吗?可以这样设想,让程序在非当前的显示页中写入信息,而后将被写入的显示页切换为当前显示页,这样可以使整屏的信息在一瞬时"弹出(Popup)"于用户眼前,使得程序具有一种快速感。当然,有时我们可能感觉直接在当前显示页中写一整屏信息并不慢,这是因为在字符模式下我们要处理的数据量比较小造成的。如果显示图形,那么使用多个显示页轮换显示就会有快速的效果。