设置一个新的int 9中断程序,在DOS下,按下A键之后,除非不再松开,如果松开,就显示满屏的A
assume cs:code
stack segment
db 128 dup(0)
stack ends
code segment
start:
mov ax,stack ;设置栈段
mov ss,ax
mov sp,128
push cs
pop ds ;将cs段给了ds
mov si,offset int9start ;然后给出偏移值
mov ax,0
mov es,ax ;给出要安装的新的中断程序的地址
mov di,204h
mov cx,offset int9end - offset int9start ;程序长度
cld
rep movsb ;开始安装
push es:[9*4] ;保存原来中断程序的地址
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4],204h ;设置我们写的中断程序的地址
mov word ptr es:[9*4+2],0
sti
mov ax,4c00h
int 21h
int9start:
push ax
push cx
push es
push di
pushf ;标志寄存器压入
call dword ptr cs:[200h] ;当中断程序执行的时候cs=0
in al,60h
cmp al,1eh+80h ;断码 = 通码+80
jne ok ;不是松开A的码,就跳到ok处
mov cx,2000
mov ax,0b800h
mov es,ax
mov di,0
s:
mov byte ptr es:[di],'A'
mov byte ptr es:[di+1],2
add di,2 ;下一个字符数据
loop s
ok:
pop di ;数据出栈
pop es
pop cx
pop ax
iret
int9end:
nop
code ends
end start
执行结果如下所示