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寄存器清零后整屏被清除。如果要验证清窗口的功能,只需稍稍修改一下窗口的左上与右下角坐标即可。其实原来提出的在屏幕上显示空格的方法也能完成诸如清"窗口",改变新行属性等功能,只是编程不如新讨论的两个功能简便而已。