12.2 8086 中断向量表
第 12.1 节已经对中断来源进行了分类,但每种事件仍需要一个服务程序地址。8086 把这些地址保存在中断向量表(Interrupt Vector Table, IVT)中。该表固定占用物理地址 00000H–003FFH。
把中断类型解析成 CS:IP
8086 支持编号为 00H–FFH 的 256 种中断类型。每个向量占四字节,因此类型 的表项从以下地址开始:
前两个字节保存 IP,后两个字节保存 CS。每个 16 位字都使用小端顺序,因此低字节位于较低地址。
对 21H 型中断,。若 00084H–00087H 保存 34H 12H 00H F0H,则 IP=1234H、CS=F000H。服务程序入口为 F000H:1234H,对应物理地址 F1234H。
IVT 结束于 003FFH,因为 字节。00H–FFH 之外的类型无法编码。若写入向量时字节顺序颠倒,或没有放在正确的四字节边界,控制就会转移到错误地址。
追踪进入状态与 IRET
中断必须保留前台程序可以继续执行的位置。假设当前状态由 FLAGS、CS、IP 和 SP 表示。8086 接收中断时会:
1. 压入 FLAGS;
2. 清除中断允许标志 IF 和陷阱标志 TF;
3. 压入 CS;
4. 压入 IP;
5. 从选中的 IVT 表项装入新 IP 和 CS。
由于栈向低地址增长,保存的 IP 最终位于栈顶。IRET 按相反顺序弹出 IP、CS、FLAGS。普通 RET 只恢复一个指令指针,无法从这种中断栈帧正确返回。
保存的 FLAGS 字包含中断发生前的 IF 和 TF。虽然处理器进入时清除了活动标志,IRET 仍能恢复原来的值。栈帧一旦被破坏,返回地址或标志状态就会改变,而且故障可能直到服务程序结束后才出现。
向量表和栈帧说明了服务程序从哪里开始、怎样返回。第 12.3 节将关注服务程序必须保护哪些状态,以及多个待处理请求应如何控制。