《汇编语言》- 读书笔记 - 第12章 内中断(Internal Interrupt)
- 任何通用CPU都有处理
中断
的能力。(如8086、8088能处理256
种不同的中断类型
) 中断
可以理解为计算机系统中的响应事件机制
。- 编写
中断响应程序
类似于编写事件回调函数
。 - 处理完
中断
要返回原来的任务中继续执行,所以处理前、处理后,需要保存和还原寄存器状态。 - 中断信息可以来自 CPU 的
内部
和外部
,这一章主要讨论来自于 CPU内部
的中断信息。
12.1 内中断的产生
8086 CPU 内部中断(也称为异常或内部中断源)主要有以下几种:
中断 | 类型码 (8位) | 备注 |
---|---|---|
除法错误 | 0 |
|
单步执行 | 1 |
|
执行 into 指令 | 4 |
|
执行 int 指令 | int n 手动触发类型为 n 的中断,调用中断例程。第13章专门讲它。 |
12.2 中断处理程序
CPU接收到中断信息后,通过中断类型码
到中断向量表
中定位对应的中断处理程序
地址(段地址和偏移地址)
找到地址后修改 CS:IP
从而执行相应的中断处理程序
。
12.3 中断向量表(Interrupt Vector Table)
中断类型码
就是中断向量表
的索引
。中断向量表是CPU设计中用于存储中断处理程序入口地址
的一个固定内存区域
,它是数组
结构,每个元素占2个字
(4字节)[ 0偏移地址, 0段地址, 1偏移地址, 1段地址, 2偏移地址, 2段地址,....]
。
总体来说,中断向量表(Interrupt Vector Table, IVT):
- 位置:在8086系统中,中断向量表通常位于内存
0000:0000 ~ 0000:03FF
的1KB
空间内。(0到1023单元) - 结构:每个
中断类型码
对应表中一项
。对于8086 CPU,每个中断向量占用4个字节
,前两个字节
是偏移地址
,后两个字节
是段地址
。 - 功能:当CPU接收到中断请求时,会根据中断类型码(一个8位数值)乘以4来定位到中断向量表中的相应位置,并从中取出中断处理程序的地址信息,从而能够跳转执行相应的中断服务子程序。(类型码n:
偏移地址=n*4
,段地址=n*4+2
) - 覆盖范围:中断向量表包括了对
内部硬件中断
、外部硬件中断
以及软件中断
的响应向量,使得CPU可以根据不同的中断事件调用正确的处理函数。
总之,中断向量表是操作系统
和硬件之间
的重要桥梁,它确保了CPU能够在发生中断时准确地找到并执行对应的中断服务程序。
以下是一个简化的8086中断向量表的例子:
中断类型码 | 内存地址范围 | 含义 |
---|---|---|
0 | 0000 ~ 0003 | 除法错误(Divide Error) |
1 | 0004 ~ 0007 | 单步调试中断(Single Step) |
2 | 0008 ~ 000B | NMI(Non-Maskable Interrupt,不可屏蔽中断) |
3 | 000C ~ 000F | INT 3 断点中断(Breakpoint) |
4 | 0010 ~ 0013 | INTO 溢出中断(Overflow) |
… | … | … |
5 | 0014 ~ 007B | 5 ~ 31 为 系统保留(共27个位置) |
31 | 007C ~ 007F | |
… | … | … |
32 | 0080 ~ 0083 | 32 ~ 255 为** 用户可用** (共244个位置) |
255 | 03FC ~ 03FF |
注意,在实际应用中,尤其是现代操作系统环境下,中断向量表的内容可能会被系统BIOS或操作系统重定向或扩展。
检测点 12.1
《汇编语言》- 读书笔记 - 各章检测点归档 - 检测点 12.1
12.4 中断过程
用中断类型码
找到中断向量
,查到入口地址后设置 CS
和 IP
,这个工作是由CPU的硬件自动
完成的。
CPU 硬件完成这个工作的过程被称为中断过程
。
硬件在完成中断过程后,CS:IP
将指向中断处理程序的入口,CPU开始执行
中断处理程序。
8086CPU 在收到中断信息后,所引发的中断过程。
顺序 | 操作 | 说明 |
---|---|---|
1 | n | 取得中断类型码 N; |
2 | pushf | 标志寄存器的值入栈 |
3 | TF=0,IF=0 | 设置标志寄存器:TF=0 关闭单步模式IF=0 禁止CPU接收来自外部设备或其他源的可屏蔽中断请求,直到IF 被重新设置为1 。 |
4 | push CS |