功能描述:按F1键修改屏幕字符属性
assume cs:code
stack segment
db 128 dup(0)
stack ends
code segment
start:
;设置各寄存器的值
mov ax,stack
mov ss,ax
mov sp,128
mov ax,0
mov es,ax
push cs
pop ds
;将int9程序转移到0,204H
mov si,offset int9
mov di,204H
mov cx,offset int9_end - offset int9
cld
rep movsb
;将原中断地址保存在0:200H
push es:[9*4]
pop es:[200H]
push es:[9*4+2]
pop es:[202H]
;修改9号中断的程序入口地址,0,204H
cli ;关中断
mov word ptr es:[9*4],204H
mov word ptr es:[9*4+2],0
sti ;开中断
mov ax,4c00H
int 21H
int9:
;保存要使用的寄存器
push ax
push bx
push cx
push es
;调用原中断程序
in al,60H
pushf ;flag寄存器入栈
pushf
pop bx
and bh,11111100b ;修改IF、TF位
call dword ptr cs:[200H] ;该程序已经移动到0:204H处,此时cs为0
;判断按键值
cmp al,3bH ;F1的扫描码
jne int9ret
;循环修改屏幕颜色
mov ax,0b800H
mov es,ax
mov bx,1
mov cx,2000
s: inc byte ptr es:[bx]
add bx,2
loop s
;中断返回,寄存器弹出
int9ret:
pop es
pop cx
pop bx
pop ax
iret
int9_end: nop
code ends
end start
核心流程:
1.通过in指令将按键的扫描码放入al中
2.模拟int指令,flag入栈、修改IF、TF
3.比较al与自己想检测的按键判断是否要执行自己的逻辑
4.不是检测按键:跳到int9ret,做返回前的必要工作,是检测按键:执行自己的逻辑