内中断
1.内中断的产生
任何一个通用的CPU,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊的信息,我们可以称其为:中断信息。中断的意思是指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息
- 中断信息可以来自CPU的内部和外部(内中断,外中断)
- 内中断:当CPU的内部有需要处理的事情发生的时候,将产生中断信息,引发中断过程。这种中断信息来自CPU的内部
8086CPU的内中断(下面四种情况将产生中断信息):
- 除法错误,比如,执行div指令产生的除法溢出
- 单步执行
- 执行into指令
- 执行int指令
中断信息中包含中断类型码,中断类型码为一个字节型数据,可以表示256种中断信息的来源(中断源)
上述的4种内中断源,在8086CPU中的中断类型码如下:
- 除法错误:0
- 单步执行:1
- 执行into指令:4
- 执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供给CPU的中断类型码
2.中断处理程序、中断向量表、中断过程
中断处理程序:
- 用来处理中断信息的程序被称为中断处理程序
- 根据CPU的设计,中断类型码的作用就是用来定位中断处理程序。比如CPU根据中断类型码4,就可以找到4号中断的处理程序
中断向量表:
- 中断向量就是中断处理程序的入口地址。中断向量表就是中断处理程序入口地址的列表
- CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址
中断过程:
- 中断过程的主要任务就是用中断类型码在中断向量表中找到中断处理程序的入口地址,设置CS和IP
- 简要描述如下:
- 取得中断类型码N
- pushf
- TF=0,IF=0 (为什么这样参考单步中断)
- push CS , push IP
- (IP)=(N * 4),(CS)=(N * 4 + 2)
- 硬件在完成中断过程后,CS:IP将指向中断处理程序的入口,CPU开始执行中断处理程序
3.iret指令
CPU随时都可能执行中断处理程序,中断处理程序必须一直存储在内存某段空间之中,而中断处理程序的入口地址,即中断向量,必须存储在对应的中断向量表表项中
中断处理程序的常规编写步骤:
- 保存用到的寄存器
- 处理中断
- 恢复用到的寄存器
- 用
iret
指令返回
iret 指令描述为:pop IP
pop CS
popf
iret指令执行后,CPU回到执行中断处理程序前的执行点继续执行程序
4.除法错误中断的处理
mov ax, 1000h mov bh, 1 div bh ;除法溢出错误
- 当CPU执行div bh时,发生了除法溢出错误,产生0号中断信息,从而引发中断过程
- CPU执行0号中断处理程序
- 系统中的0号中断处理程序的功能:显示提示信息“Divide overflow”后,返回到操作系统中
编程实验:编写0号中断处理程序do0,当发生除法溢出时,在屏幕中间显示“overflow!”,返回DOS
实验要求:
- 00