8086汇编学习笔记16

内中断

系列文章

包括8086CPU在内的任意CPU都有能力,在执行完当前正在执行的指令后检测到从CPU外部发送来或内部产生的一些特殊信息,并且可以立即对所接收到的信息进行处理,这种特殊的信息称为中断信息

中断的意思是CPU不再继续向下执行,而是转去处理这个特殊信息。

中断信息可以来自外部与内部,本章主要介绍来自内部的中断信息。

中断过程

当CPU内部有以下情况发生时,将产生相应的中断信息:

  1. 除法错误(例如使用 DIV 指令产生的除法溢出)
  2. 单步执行
  3. 执行 INTO 指令
  4. 执行 INT 指令

8086CPU使用中断类型码来标识中断信息的来源。中断类型码为一个字节型数据,可以表示256种中断信息的来源。上述四种中断源,对应的中断类型码如下:

  1. 除法错误:0
  2. 单步执行:1
  3. 执行 INTO 指令:4
  4. 执行 INT 指令:可以自行提供中断类型码

CPU收到中断信息后,需要对中断信息进行处理。用来处理中断信息的程序称为中断处理程序。一般来说,需要对不同的中断信息编写不同的处理程序。

中断处理程序的入口地址称为中断向量,中断向量组成的列表称为中断向量表

对于8086PC机,中断向量表在内存地址 0000:00000000:03FF 中的1024的内存单元中存放,其中存放着256个中断源所对应的中断处理程序的入口

每一个中断向量都对应一个中断处理程序的入口地址,这个入口地址包含段地址和偏移地址,所以一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址

以下是8086CPU在收到中断信息后,所引发的中断过程

  1. 从中断信息中,取得中断类型码
  2. 标志寄存器的值入栈(在中断过程中要改变标志寄存器的值)
  3. 设置标志寄存器的第8位TF和第9位IF的值为0
  4. CS 的值入栈
  5. IP 的值入栈
  6. 从内存地址为中断类型码×4中断类型码×4+2的两个字单元中读取中断处理程序的入口地址,设置 CSIP

在最后一步完成后,CPU开始执行编写的中断处理程序。

中断处理程序和IRET指令

CPU随时都可能检测到中断信息,执行中断处理程序,因此中断处理程序必须一直存储在内存某段空间中。

中断处理程序的编写方式与子程序类似,下面是常规的步骤:

  1. 保存用到的寄存器
  2. 处理中断
  3. 恢复用到的寄存器
  4. IRET 指令返回

IRET 指令的功能为:依次出栈至 IPCSflag

该指令通常和硬件自动完成的中断过程配合使用。在中断过程中,寄存器入栈的顺序是 flagCSIP ,而 IRET 出栈的顺序刚好与其对应,实现了用执行中断处理程序前的CPU恢复标志寄存器和 CSIP 的工作IRET 指令执行后,CPU回到执行中断处理程序前的执行点继续执行程序。

单步中断

CPU在执行完一条指令之后,如果检测到标志寄存器的 TF 位为1,则产生单步中断,引发中断过程。单步中断的中断类型码为1,则它引发的中断过程如下:

  1. 取得中断类型码1
  2. 标志寄存器入栈
  3. 标志寄存器TF、IF位设置为0
  4. CSIP 入栈
  5. CS:IP 被设置为6:4

CPU提供单步中断功能为单步跟踪程序的执行过程提供了实现机制。

响应中断的特殊情况

部分情况下,CPU在执行完当前指令后,即使发生中断,也不会响应。

一种情况是,在执行完向 SS 寄存器传送数据的指令后,即使是发生中断,CPU也不会响应。

这是由于 SS:SP 联合指向栈顶,对它们的设置应该连续完成。如果其中发生中断,需要向栈中压入标志寄存器、CSIP ,但此时 SS:SP 指向的不是正确的栈顶,将引起错误。

因此在程序中,栈顶的设置应连续完成。

INT指令

INT指令(中断指令)
格式:
INT n
用途:
引发 n 号中断。

可以在程序中使用 INT 指令,调用任何一个中断的中断处理程序INT 指令和 CALL 指令的最终功能相似,都是调用一段程序。

一般情况下,系统将具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用。