中断处理过程
中断的相关定义
- 中断:在CPU执行程序的过程中,出现了某种紧急情况或异常的事件时,暂停正在执行的程序,转去处理该事件,并在处理完该事件之后返回断点处(指返回主程序时执行的第一条指令的地址)继续执行刚刚被暂停的程序。
- 中断源:任何引发中断的事件。
8086将其分为两类:
1)硬件中断(即外中断)
(1)非屏蔽中断(NMI):整个系统只有一个。
(2)可屏蔽中断(INTR)
2)软件中断(内中断)
(1)除法错中断(中断类型号:0)
(2)溢出中断(中断类型号:4)
(3)单步中断(中断类型号:1)
(4)断点中断(中断类型号:3)
(5)中断指令INT n中断(中断类型号:n)
注意: 单步中断和断点中断用来调试程序。 - 中断优先级:8086的中断优先级排序:内中断(除单步中断),NMI,INTR,单步中断。
- 中断向量表:是存放中断向量(中断服务程序的入口地址)的一个特定的内存区域。这里有必要注意一下,8086可以处理256种中断。
一般的中断处理步骤如下:
- 中断请求:中断源向CPU发出中断请求
- 中断响应
- 保护断点和现场:以便在中断服务程序执行后正确的返回主程序。
- 中断处理
- 中断返回
8086中断处理步骤如下:
- 内部中断以及NMI中断不需要从数据总线上读取中断类型码,而INTR需要,而且该中断类型码由发出中断请求的接口电路提供。
- CPU得到中断类型码后将标志寄存器内容压入栈中(PUSHF),保护中断时标志位的状态。
- 令单步标志TF =0(禁止CPU以单步方式执行中断服务程序)。
- 令中断允许标志IF=0(即:在响应该中断后不再响应别的中断。由于CPU在中断响应时,自动将IF置为0,如果要允许中断嵌套,必须在后面的中断服务程序中用开中断指令STI重新将IF置为1)
- 将当前CS:IP入栈,即保护断点和现场。
- 根据中断类型码在中断向量表中找到相应中断服务程序的入口地址,将其装入CS:IP,转向中断服务程序。
- 为了保证NMI中弄断有着实质性的优先级,所以在执行中断服务之前需要再次检查是否有NMI中断。
- 执行中断服务程序。
- IRET指令实现原CS:IP,标志寄存器的出栈,即恢复断点并返回到主程序。