实验15 安装新的int 9中断例程
功能:
在DOS下,按下“A”键后,除非不再松开,如果松开,就显示满屏幕的“A”,其他的按键照常处理。
提示:
“A”的通码为1EH,断码为9EH。
断码 = 通码 + 80H
程序分析:
按下按键,发生中断时,只要“A”按键不松开,就陷入死循环;
“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
push ds
mov si,offset int9
mov ax,0
mov es,ax
mov di,204h
mov cx,offset int9end - offset9
cld
rep movsb
; 转存BIOS 9号中断例程的入口地址到0:200
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
; 设置BIOS的9号中断例程的入口地址为0:204
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0h
sti
mov ax,4c00h
int 21h
int9: push ax
push es
push di
push cx
in al,60h
pushf
call dword ptr cs:[200h]
cmp al,1Eh
jne int9ret
; 如果按下“A”后,没有松开,就一直死循环
; 松开之后就执行屏幕输出
s: in al,60h
cmp al,9Eh
jne s
; 向满屏幕上输出“A”
mov ax,0b800h
mov es,ax
mov di,0
mov cx,2000
s0: mov byte ptr es:[di],’A’
add di,2
loop s0
int9ret:pop cx
pop di
pop es
pop ax
iret
int9end:nop
code ends
end start