code segment
assume cs:code,ds:code
org 100h
main proc far
jmp short start
msg db 'Press any key...',0dh,24h
start: mov ah,09h ;显示字符串MSG
mov dx,offset msg
int 21h
mov cx,25 ;设置循环计数
loop1:
push cx ;暂存CX寄存器中的循环计数
mov cx,0 ;设置滚动窗口的左上角为(0,0)
mov dx,194fh ;设置滚动窗口的右下角为(79,25)
mov bh,2 ;设置新行的属性
mov ah,6 ;选择10H中断的06功能
mov al,1 ;准备将窗口中的内容向上滚动1行
int 10h ;滚动窗口内容
mov ah,0 ;等待键盘输入
int 16h
pop cx ;恢复CX寄存器中的循环计数
loop loop1 ;继续滚动窗口
int 20h ;结束进程
main endp
code ends
end main
运行这个程序,刚刚设想的第(1)、(3)点都可得到验证。下面这个程序使用了07H功能,而且可以验证我们设想的第(2)点:
code segment
assume cs:code,ds:code
org 100h
main proc far
jmp short start ;跳过数据区
msg db 'Press any key...',0dh,24h
start: mov ah,09h ;显示字符串MSG
mov dx,offset msg
int 21h
mov bl,4 ;设置循环计数
loop1:
mov ah,0 ;等待键盘输入
int 16h
mov cx,0 ;设置窗口的左上角为(0,0)
mov dx,194fh ;设置窗口的右下角为(79,25)
mov bh,2 ;设置插入行的属性
mov al,bl ;以循环计数作为滚动的行数
mov ah,7 ;选择10H中断的07功能
int 10h ;向下滚动窗口
dec bl ;循环计数减1
jns loop1 ;循环至LOOP1继续
int 20h ;结束进程
main endp
code ends
end main
在这个程序中“等待键盘输入”的位置做了些调整,运行这个程序时可以清楚的看到屏幕自上而下滚动4、3、2、1行的情况,以及AL寄存器清零后整屏被清除。如果要验证清窗口的功能,只需稍稍修改一下窗口的左上与右下角坐标即可。其实原来提出的在屏幕上显示空格的方法也能完成诸如清"窗口",改变新行属性等功能,只是编程不如新讨论的两个功能简便而已。