安装一个新的int 7ch中断例程,为显示输出提供如下的功能子程序。
(1)清屏。
(2)设置前景色。
(3)设置背景色。
(4)向上滚动一行
(一)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行;
(二)对于2、3号功能,用al传递颜色值,(al)∈{0,1,2,3,4,5,6,7}。
代码如下:
;功能:安装一个新的int7ch中断例程,实现一个子程序 setScreen ,提供如下功能: ; (1)清屏。 ; (2)设置前景色。 ; (3)设置背景色。 ; (4)向上滚动一行 ; 入口参数说明: ; (1)每个子程序用 ah 寄存器传递功能号: ; (2)对于2、3号功能,用al传送颜色值, assume cs:code,ds:data data segment err db ' ~~~~~ ah args is error! ~~~~~','$' init dw 10 dup(0) data ends code segment start: mov ax,data mov ds,ax mov ax,0 mov es,ax mov ax,es:[7ch*4] mov init[0],ax mov ax,es:[7ch*4+2] mov init[1],ax mov es:[7ch*4],offset setScreen mov es:[7ch*4+2],cs mov ax,102h int 7ch ;call breakPoint mov ax,201h int 7ch ;call breakPoint mov ax,300h int 7ch ;call breakPoint mov ax,0h int 7ch mov ax,400h int 7ch mov ax,0 mov es,ax mov ax,data mov ds,ax mov ax,init[0] mov es:[7ch*4],ax mov ax,init[1] mov es:[7ch*4+2],ax ok: mov ax,4c00h int 21h setScreen: jmp short setmain list dw sub0,sub1,sub2,sub3 setmain: cmp ah,3 ja subErr mov bl,ah mov bh,0 shl bx,1 call word ptr list[bx] iret sub0: ;清屏 mov cx,0b800h mov es,cx mov cx,2000 mov bx,0 sub0s: mov byte ptr es:[bx],' ' add bx,2 loop sub0s ret sub1: ;设置前景色。 mov cx,0b800h mov es,cx mov cx,2000 mov bx,1 sub1s: and byte ptr es:[bx],11111000b or es:[bx],al add bx,2 loop sub1s ret sub2: ;设置背景色。 mov cx,0b800h mov es,cx mov cx,2000 mov bx,1 shl al,1 shl al,1 shl al,1 shl al,1 sub2s: and byte ptr es:[bx],10001111b or es:[bx],al add bx,2 loop sub2s ret sub3: ;向上滚动一行 mov cx,0b800h mov es,cx mov ds,cx mov di,0 mov si,160 cli mov cx,24 sub3s: push cx mov cx,160 rep movsb pop cx loop sub3s mov cx,160 mov bx,0 sub3s1: mov byte ptr es:3840[bx],' ' add bx,2 loop sub3s1 ret subErr: ;显示错误信息 mov ax,data mov ds,ax mov ah,9 mov dx,offset err int 21h jmp ok breakPoint: ;设置断点,用于调试 pushf pop bx or bh,3 push bx popf ret code ends end start