中断处理程序

引例

除法错误中断处理

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
  1. 安装目的
    改写的中断程序操作代码的放入一段需要一块不会被其他程序占用的内存空间,也就是复制一份
  2. 设置中断向量表目的
    CPU可以找到该中断程序代码的入口地址,去执行
  3. 改写的中断程序操作代码
    这里就是要被安装上去的中断程序操作代码

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yilyil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值