关键步骤:
- 保存中断向量表int9的地址到changeColor代码的data区
- 把changeColor代码写进中断向量表
- 把int9的地址设置为中断向量表里changeColor代码的地址
程序运行后,按F1依旧可以改变屏幕字体颜色
assume cs:code,ds:data
data segment
db 16 dup(0)
data ends
code segment
start:
mov ax,0
mov es,ax
mov di,200h
mov ax,code
mov ds,ax
mov si,offset dataStart
mov ax,es:[4*9]
mov ds:[si],ax
mov ax,es:[4*9+2]
mov ds:[si+2],ax
mov si,offset changeColor
mov cx,offset end1-offset changeColor
cld
rep movsb
cli
mov word ptr es:[4*9],200h
mov word ptr es:[4*9+2],0
sti
mov ax,4c00h
int 21h
changeColor:
jmp short codeStart
dataStart:
db 8 dup(0)
codeStart:
push cx
push di
push ax
push es
in al,60h
cmp al,3bh ;//F1的扫描码
jnz there
mov cx,2000
mov di,1
s: ;//奇数地址的位置全是颜色的值
mov ax,0b800h
mov es,ax
inc byte ptr es:[di]
add di,2
loop s
there:
pushf
mov ax,0
mov es,ax
mov di,offset dataStart-offset changeColor
call dword ptr es:[200h+di]
pop es
pop ax
pop di
pop cx
iret
end1:
code ends
end start