汇编语言_第12章 内中断

12.1 内中断的产生
8086 CPU 当CPU内部有下面情况发生时,将产生相应的中断信息:
(1) 除法错误,比如,执行div指令产生的除法溢出;
(2) 单步执行;
(3) 执行into指令;
(4) 执行int指令。

8086CPU 用称为中断类型码的数据来表示中断信息的来源。中断类型码为一个字节型数据,可以表示256种中断信息的来源。
8086CPU中的中断类型码如下:
(1) 除法错误: 0
(2) 单步执行: 1
(3) 执行into指令: 4
(4) 执行int指令,该指令的格式:int n,指令中n为字节型立即数,是提供给CPU的中断类型码。

12.2 中断处理程序
用来处理中断信息的处理程序,称为中断处理程序。
中断类型码是用来定位中断处理程序的。

12.3 中断向量表

  • 中断向量表:中断向量的列表。即 中断处理程序入口地址的列表。
  • 中断向量:中断处理程序的入口地址。
  • 中断向量表在内存中保存,其中存放着256个中断源所对应的中断处理程序入口。
    可见CPU 只要知道了中断类型码,就可以将中断类型码作为中断向量表的项号,定位相应的表项,从而得到中断处理程序入口地址。
    即:CPU 用中断类型码,通过查找中断向量表,就可以得到中断处理程序的入口地址
  • 中断向量表在内存中存放,对于8086 PC机,中断向量表指定放在内存地址0处。(从内存0000:0000
    ~0000:03FF的1024个单元中) 注:不能在别处,这是规定,因为8086CPU就从这个地方读取中断向量表。
  • 中断向量表,一个表项存放一个中断向量,即已个中断处理程序的入口地址。对于8086CPU
    ,这个入口地址包括段地址和偏移地址,所以一个表项占2个字,高地址字存放段地址,低地址字存放偏移地址。

12.4 中断过程
用中断类型码找到中断向量,并用它设置CS 和IP ,这个工作是由CPU的硬件自动完成的。CPU硬件完成这个工作的过程被称为中断过程。

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

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

简单描述如下:

1.取得中断类型码N;
2.pushf
3.TF=0,IF=0
4. push CS
5. push IP
6. (IP)=(N4),(CS)=(N4+2)
最后一步分完成后,CPU开始执行由程序员编写的中断处理程序。

12.5 中断处理程序和 iret

中断处理程序的编写常规步骤:
(1) 保存用到的寄存器;
(2) 处理中断;
(3) 恢复用到的寄存器;
(4) 用iret指令返回;

iret指令的功能 用汇编语言描述:
pop IP
pop CS
popf
iret 通常和硬件自动完成的中断过程配合使用。

12.6 编程处理0号中断
在这里插入图片描述

12.11 单步中断
CPU 在执行一条指令后,如果检测到标志寄存器TF位为1,则产生单步中断,引发中断过程。单步中断的中断类型码为1. 引发的中断过程如下:
(1) 取得中断类型码1;
(2) 标志寄存器入栈,TF、IF设置为0;
(3) CS、IP入栈;
(4) (IP)=(14),(CS)=(14+2)

  • Debug 是如何利用CPU所提供的但不中断的功能的?
    Debug提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令。然后,在使用t命令执行指令时,Debug将TF设置为1,使得CPU工作于单步中断方式下,则在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被显示在屏幕上,并且等待输入命令。

  • 当TF=1时,CPU执行完一条指令后将引发单步中断,转而去执行中断处理程序。如果TF始终为1,则在执行中断处理程序时,也会每执行一步引发单步中断。?
    故:在进入中断处理储程序之前,设置TF=0.从而避免CPU在执行中断处理程序的时候发生单步中断。这就是为什么再中断过程中有TF=0这个步骤。

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

12.12 相应中断的特殊情况

  • 在执行完向ss寄存器传送数据的指令后,即便是发生中断,CPU 也不会响应。
    原因:ss:sp 联合指向栈顶,而对它们的设置应该连续完成。如果在执行完设置ss的指令后,CPU相应中断,引发中断过程,要在栈中压入标志寄存器、CS 和IP的值。而ss 改变,sp未改变,ss:sp指向的不是正确的栈顶,将引起错误。

To be continue…

猜你喜欢

转载自blog.csdn.net/madao1234/article/details/84535861