1 assume cs:code
2 ;重写int9中断例程,当按住a后松开,便会产生满屏A
3 stack segment
4 dw 64 dup(0)
5 stack ends
6
7 code segment
8 start:
9 mov ax,stack
10 mov ss,ax
11 mov sp,80h
12
13 mov ax,0
14 mov es,ax
15
16 push cs
17 pop ds ;设置当前段地址
18
19 mov si,offset int9;设置当前偏移地址
20 mov di,204h ;设置目的偏移地址
21 mov cx,offset int9end - int9 ;复制的执行代码长度
22 cld
23 rep movsb
24
25 push es:[9*4]
26 pop es:[200h]
27 push es:[9*4+2]
28 pop es:[202h] ;把原int9入口地址储存到0020:0到0020:4处
29
30 cli
31 mov word ptr es:[9*4],204h
32 mov word ptr es:[9*4+2],0 ;把信int9入口地址复制到中断向量表
33 sti
34
35 mov ax,4c00h
36 int 21h
37 int9:
38 push ax
39 push bx
40 push cx
41 push es
42
43 in al,60h
44
45 pushf
46 call dword ptr cs:[200h]
47
48 cmp al,1Eh
49 jne int9ret
50 s0: ;在按到a的可能上,确定放开才执行后面打印程序
51 in al,60h
52 cmp al,9Eh
53 jne s0 ;确定断开,才打印屏幕A
54 mov ax,0b800h
55 mov es,ax
56 mov bx,0
57 mov cx,2000
58 s:
59 mov byte ptr es:[bx],'A'
60 add bx,2
61 loop s
62 int9ret:
63 pop es
64 pop cx
65 pop bx
66 pop ax
67 iret
68 int9end:
69 nop
70 code ends
71
72 end start