任何一个通用的 CPU ,比如 8086 都具备这样一种能力,检测从 CPU 内部或者外部发过来的一种信息,并且可以立即对收到的信息进行处理。这种信息就是我们常说的中断信息。从 CPU 内存产生的这种信息称为内中断,从 CPU 外部产生的这种信息称为外中断。
对于 8086CPU,内部有下面的情况发生后,将产生相应的中断信息:
- 除法错误
- 单步执行
- 执行 int0 指令
- 执行 int 指令
我们将产生中断信息的事件,即中断信息的来源称为中断源。中断信息中包含识别来源的编码,这个编码为一个字节型数据,可以表示 256 种中断源。上述 4 种中断源,在 8086 中的中断类型码如下:
- 除法错误:0
- 单步执行:1
- 执行 int0:4
- 执行 int 指令,该指令的格式为 int n ,指令中的 n 为字节型立即数,是提供给 CPU 的中断类型码
CPU 收到中断信息后,需要对中断信息进行处理,这个可以由我们编写代码来确定。用来处理中断的程序被称为中断处理程序。可以设置 CS:IP 的值来执行我们编写的中断处理程序。问题在于中断信息中只有一个中断类型码,怎么来设置 CS:IP 呢?CPU 用 8 位的中断类型码可以从中断向量表中找到对应的 CS 和 IP。中断向量就是中断处理程序的入口,即 CS 和 IP 的值,中断向量表就是中断处理程序入口的列表。可见 CPU 只要知道了中断类型码,就可以通过查找中断向量表找出对应的中断处理程序入口。
中断可能随时发生,要想在发生中断时去执行中断处理程序,那么在发生中断前中断处理程序就应该放在某个地方等待执行。对于 8086PC 机,中断向量表指定放在内存地址 0 处,从内存 0000:0000 ~ 0000:03e8 的 1000 个单元中。
中断过程
下面描述的 8086CPU 的中断过程
- 取得中断类型码
- 标志寄存器入栈
- 设置标志寄存器的 TF 和 IF(在进入中断处理程序后禁止其它可屏蔽中断) 为 0
- CS 的内容入栈
- IP 的内容入栈
- 从中断向量表中找到入口设置 CS 和 IP
int 指令
格式为 int n,功能为引发中断过程。
BIOS 和 DOS 中断安装过程
- CPU 一加电,初始化 CS:IP 为 0FFFFH:0,自动从 FFFF:0 这个单元执行程序。 FFFF:0 处有一条跳转指令,转去执行 BIOS 中的硬件系统检测和初始化程序。
- 初始化程序建立 BIOS 中断向量表,它是固化在 ROM 中的程序,一直存在内存中。
- 硬件系统检测和初始化完成后,调用 19h 进行操作系统的引导。
- DOS 启动后,除完成其它工作外,还将它提供的中断向量表装入内存。
端口
在 PC 机系统中,和 CPU 通过总线相连的芯片除各种寄存器外,还有以下 3 种芯片
- 各种接口卡(网卡、显卡)上的接口芯片,它们控制接口卡进行工作
- 主板上的接口芯片,CPU 通过它们对部分外设进行访问
- 其它芯片,用来存储相关系统信息
在上述的这些芯片中,都有一组可以由 CPU 读写的寄存器。CPU 对它们进行读或写的时候都通过控制线向它们所在的芯片发出端口读写命令。
端口的读写只有两条指令 in 和 out ,分别表示从端口读数据和写数据。
外中断
外中段分为以下两种:
- 可屏蔽中断
- 不可屏蔽中断
可屏蔽中断是当中断到来时,CPU 可以不处理中断。CPU 是否响应可屏蔽中断,要看标志寄存器 IF 位的设置。如果 IF = 1,则 CPU 执行完当前指令后响应中断,如果 IF = 0,则不响应可屏蔽中断。
不可屏蔽中断的中断类型码固定为 2 。