安装新的int9中断例程的程序只能执行一次。
- 第一次执行安装程序时,通过
0:[9*4]
和0:[9*4+2]
得到了int9
的cs
和ip
,然后把int9
的cs
、ip
存在了0:200h
中,new_int9
可以通过读取0:200h
中的数据执行int9
; - 第二次执行时,和第一次执行时的逻辑相同,但是通过
0:[9*4]
和0:[9*4+2]
得到的是new_int9
的cs
和ip
,并不是int9
的cs
和ip
,所以第二次执行时,相当于new_int9
一直在调用自身从而导致了死循环; int9
是指BIOS中的中断例程,new_int9
是指添加了新的功能的中断例程(相当于下面代码中的int9
)
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
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9_end - offset int9
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
int9:
push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h]
cmp al,3ch
jne int9_ret
mov ax,0b800h
mov es,ax
mov bx,1
mov cx,2000
s: inc byte ptr es:[bx]
add bx,2
loop s
int9_ret:
pop es
pop cx
pop bx
pop ax
iret
int9_end:nop
code ends
end start