引例
除法错误中断处理
assume ds:a
a segment
mov ax,1000h
mov bh,1
div bh
mov ax,1h
a ends
end
上面源代码u查找的汇编指令
我们执行完div bh,我们应该执行076a:0007的mov ax,0001,但是因为这个除法溢出,所以获取调用0号中断处理程序,即0000:0 ~0000:3 四个字节的内容,就是这个中断处理程序的入口地址
验证0000:0 ~0000:3的内容
编写处理0号中断
assume cs:code
code segment
start:
安装
设置中断向量表
mov ax,4c00h
int 21h
改写的中断程序操作代码
code ends
end start
- 安装目的
改写的中断程序操作代码的放入一段需要一块不会被其他程序占用的内存空间,也就是复制一份 - 设置中断向量表目的
CPU可以找到该中断程序代码的入口地址,去执行 - 改写的中断程序操作代码
这里就是要被安装上去的中断程序操作代码
1. 安装代码
我们的中断处理程序安装完毕后,防止在程序执行完退出被覆盖,我们也需要放入一个不被覆盖的内存空间,而这段内存空间,我们选用0:200处,虽然是向量中断表的,但是中断类型显然没有那么多,我们先使用这段空间
mov ax,cs
mov ds,ax
mov si,offset InterruptHandler_0 ;设置ds:si 指向源地址
mov ax,0
mov es,ax
mov di,200h ;设置es:di 指向目的地址
mov cx,offset InterruptHandler_0end-offset InterruptHandler_0 ;设置次数,编译器计算两个标识的距离
cld
rep movsb
ds:si 指向源地址 设置为cs:标识
es:di 指向目的地址 设置为0:200h
cx 设置传输次数即长度
2. 改写中断处理程序:
为了防止我们需要的显示的overflow,在程序执行完退出被覆盖,我们也需要放入一个不被覆盖的内存空间,我们同样也用到0:200的空间
InterruptHandler_0:
jmp short start0
db "overflow"
start0: mov ax,cx
mov ds,ax
mov si,202h ;设置ds:si 指向源地址
mov ax,0b800h
mov es,ax
mov di,12*160+36*2 ;设置es:di 指向目的地址
mov cx,9
s: mov al,[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
InterruptHandler_0end: nop
ds:si 指向源地址 设置为db "overflow”定义这些字符所在地址
es:di 指向目的地址 设置为显存空间的中间位置
cx 设置传输次数即长度
3. 设置中断向量表代码
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0