assume cs:codesg
codesg segment
start:
mov ax,cs
mov ds,ax
mov si,offset int9 ;设置源地址
mov ax,0
mov es,ax
mov di,204h ;设置目的地址
mov cx,offset int9End - offset int9 ;循环次数
cld ;设置DF=0 正向传送
rep movsb ;将新的9号中断程序安装到指定位置
;----------------------------------以上程序为安装新的9号中断程序到 0200h:4 地址处-----------------------
mov ax,es:[9*4] ;**注意不是直接 mov word ptr es:[200h],9*4+2 是要保存内存单元 0:9*4 处数据**
mov word ptr es:[200h],ax ;保存原来的9号中断例程IP 87 E9 00 F0
mov ax,es:[9*4+2]
mov word ptr es:[202h],ax ;保存原来的9号中断例程CS
cli ;IF=0 禁止中断发生 防止还没保存好中断例程时 就开始调用用中断例程
mov word ptr es:[9*4],204h ;设置新的9号中断例程入口
mov word ptr es:[9*4+2],0
sti
;--------------------------使用空循环来测试新安装的中断例程 start-------------------------
mov ax,0ffffh
mov dx,0ffffh
s1: sub ax,1
cmp ax,0
jne s1
sbb dx,0 ;借位减法
cmp dx,0
jne s1
cli ;IF=0 禁止中断发生 防止还没保存好中断例程时 就开始调用用中断例程
mov ax,es:[200h]
mov word ptr es:[9*4],ax
mov ax,es:[202h]
mov word ptr es:[9*4+2],ax
sti ;测试完成 回复原来的中断例程
;--------------------------使用空循环来测试新安装的中断例程 end-------------------------
mov ax,4c00h
int 21h
int9:
push ax
push bx
push cx
push es
push si
in al,60h ;从60h端口中读取 键盘输入产生的扫描码
pushf ;标志寄存器入栈
call dword ptr es:[200h]
cmp al,3bh
jne int9ret
mov cx,2000
mov ax,0b800h
mov es,ax
mov si,1
s: inc byte ptr es:[si]
add si,2
loop s
int9ret:
pop si
pop es
pop cx
pop bx
pop ax
iret
int9End:nop
codesg ends
end start
需要注意的地方
在保存原来的9号中断例程的中断向量时,不是
mov word ptr es:[200h],9*4+2
mov word ptr es:[202h],0
应该将9号中断例程的中断向量保存到对应的内存单元
mov ax,es:[9*4]
mov word ptr es:[200h],ax ;保存原来的9号中断例程IP 87 E9 00 F0
mov ax,es:[9*4+2]
mov word ptr es:[202h],ax ;保存原来的9号中断例程CS