汇编语言中断过程

从上面的讲解中,我们知道,可以用中断类型码,在中断向量表中找到中断处理程序的入口。找到这个入口地址的最终目的是用它设置 CS 和 IP,使 CPU 执行中断处理程序。用中断类型码找到中断向量,并用它设置 CS 和 IP,这个工作是由 CPU 的硬件自动完成的。CPU 硬件完成这个工作的过程被称为中断过程。
  CPU 收到中断信息后,要对中断信息进行处理,首先将引发中断过程。硬件在完成中断过程后,CS:IP 将指向中断处理程序的入口,CPU 开始执行中断处理程序。
  有一个问题需要考虑,CPU 在执行完中断处理程序之后,应该返回原来的执行点继续执行下面的指令。所以在中断过程中,在设置 CS:IP 之前,还要将原来的 CS 和 IP 的值保存起来。在使用 call 指令调用子程序时有同样的问题,子程序执行后还要返回到原来的执行点继续执行,所以,call 指令先保存当前 CS 和 IP 的值,然后再设置 CS 和 IP。
  下面是 8086CPU 在收到中断信息后,所引发的中断过程、
  (1)(从中断信息中)取得中断类型码;
  (2)标志寄存器的值入栈(因为要在中断过程中改变标志寄存器的值,所以先将其保存在栈中);
  (3)设置标志寄存器的第 8 位 TF 和第 9 位 IF 的值为 0;
  (4)CS 的内容入栈;
  (5)IP 的内容入栈;
  (6)从内存地址为中断类型码*4 和中断类型码*4+2 的两个字单元中读取中断处理程序的入口地址设置 IP 和 CS。
CPU在收到中断信息之后,如果处理该中断信息,就完成一个由硬件自动执行的中断过程(程序员无法改变这个过程中所要做的工作)。中断过程的主要任务就是用中断类型码在中断向量表中找到中断处理程序的入口地址,设置CS和IP。因为中断处理程序执行完成后,CPU还要回过头来继续执行被中断的程序,所以要在设置CS. IP之前,先将它们的值保存起来。可以看到CPU将它们保存在栈中。我们注意到,在中断过程中还要做的一个工作就是设置标志寄存器的TF. IF位,对于这样做的目的,我们将在后面的内容和下一章中进行讨论。因为在执行完中断处理程序后,需要恢复在进入中断处理程序之前的CPU现场(某一时刻,CPU中各个寄存器的值)。所以应该在修改标记寄存器之前,将它的值入栈保存。
  我们更简洁地描述中断过程,如下:

  (1)取得中断类型码 N;
  (2)pushf
  (3)TF=0,IF=0
  (4)push CS
  (5)push IP
  (6)(IP)=(N*4),(CS)=(N*4+2)

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


发布日期:

所属分类: 编程 标签:  


没有相关文章!