安装一个新的int 7ch中断例程,提供如下功能
1.清屏
2.设置前景色
3.设置背景色
4.向上滚动一行
入口参数如下(功能号0-3,颜色值0-7):
(ah) = 功能号,(al) = 颜色值
测试程序:
assume cs:codesg
codesg segment
start:
mov ah,1
mov al,4
int 7ch ;设置文字颜色为红色
mov ah,2
mov al,2
int 7ch ;设置背景颜色为绿色
mov ax,4c00h
int 21h
codesg ends
end start
int 7ch中断例程:
assume cs:codesg
codesg segment
start: ;7ch中断例程安装程序
mov ax,datasg
mov ds,ax
mov si,offset setscreen
mov ax,0
mov es,ax
mov di,200h
mov cx,(offset setscreen_end - offset setscreen)
cld
rep movsb
mov word ptr es:[4*7ch],0
mov word ptr es:[4*7ch+2],20h
mov ax,4c00h
int 21h
codesg ends
datasg segment ;将中断例程放进一个段内,这样table中的偏移地址才是正确的
setscreen: ;以下程序和书上一样
jmp set
table dw offset sub1,offset sub2,offset sub3,offset sub4
set:push bx
xor bx,bx
mov bl,ah
add bx,bx
call table[bx]
pop bx
iret
sub1:
push es
push bx
push cx
xor bx,bx
mov ax,0b800h
mov es,ax
mov cx,80*25
s1: mov byte ptr es:[bx],' '
add bx,2
loop s1
pop cx
pop bx
pop es
ret
sub2:
push es
push bx
push cx
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,80*25
s2: and byte ptr es:[bx],11111000B
or es:[bx],al
add bx,2
loop s2
pop cx
pop bx
pop es
ret
sub3:
push es
push bx
push cx
mov cl,4
shl al,cl
mov bx,0b800h
mov es,bx
mov cx,80*25
mov bx,1
s3: and byte ptr es:[bx],10001111B
or es:[bx],al
add bx,2
loop s3
pop cx
pop bx
pop es
ret
sub4:
push cx
push ds
push es
push di
push si
mov ax,0b800h
mov ds,ax
mov es,ax
mov si,160
mov di,0
cld
mov cx,160*24
rep movsb
mov cx,80
xor si,si
s4: mov byte ptr ds:[si+160*24],' '
add si,2
loop s4
pop si
pop di
pop es
pop ds
pop cx
ret
setscreen_end:
nop
datasg ends
end start
运行截图: