贴上一篇代码,是关于改写外中断 int9来实现字幕换色
assume cs:code
stack segment
db
128
dup(
0
)
stack ends

data segment
dw
0
,
0
data ends

code segment
start:
mov ax,stack
mov ss,ax
mov sp,
128

mov ax,data
mov ds,ax

mov ax,
0
mov es,ax

push es:[
9
*
4
]
pop ds:[
0
]
push es:[
9
*
4
+
2
]
pop ds:[
2
] ;将原来的int9中断例程的入口地址保存在ds:
0
,ds:2单元中

cli ;此处注意,置IF
=
0,屏蔽一切其他外中断
mov word ptr es:[
9
*
4
],offset int9_new
mov es:[
9
*
4
+
2
],cs ;在中断向量表中设置新的int9 中断例程的入口地址
sti

mov ax,0b800h
mov es,ax
mov ah,
'
a
'
s: mov es:[
160
*
12
+
40
*
2
],ah
call delay ;延迟字幕改变速度,掉哟dalay子程序
inc ah
cmp ah,
'
z
'
jna s
mov ax,
0
mov es,ax
push ds:[
0
]
pop es:[
9
*
4
]
push ds:[
2
]
pop es:[
9
*
4
+
2
] ;将中断向量表中int9 中断例程的入口恢复为原来的地址
mov ax,4c00h
int
21h
delay: push ax
push dx
mov dx,3000h
mov ax,
0
s1: sub ax,
1
sbb dx,
0
cmp ax,
0
jne s1
cmp dx,
0
jne s1
pop dx
pop ax
ret
int9_new:

push ax
push es

in
al,60h

pushf
call dword ptr ds:[
0
] ;对int
9
指令进行模拟,调用原来的int9 中断例程

cmp al,
1 ;检验是否为ESC键
jne int9_ret

mov ax,0b800h
mov es,ax
inc
byte
ptr es:[
160
*
12
+
40
*
2
+
1
] ;改变颜色

int9_ret:
pop es
pop ax
iret

code ends

end start
