贴上一篇代码,是关于改写外中断 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
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