引言:
中断的意思是指,cpu不再接着(刚执行完的指令)向下执行,而是专区处理这个特殊信息。
注意,我们这里所说的中断信息,是为了便于理解而采用的某种逻辑上的说法。它是对几个具有先后顺序的硬件操作所产生的事件的统一描述。
当cpu的内部有什么事情发生的时候,将产生需要马上处理的中断信息呢?
对于8086cpu,当内部有下面情况发生的时候,将产生中断信息。
1、除法错误,比如:执行div指令产生的除法溢出
2、单步执行
3、执行int0指令
4、执行int指令
上述的4中中断源,在8086cpu中的中断类型码如下:
1)出发错误:0
2)单步执行:1
3)执行int0指令
4)执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供给cpu的中断类型码
cpu的设计者必须在中断信息和其处理程序的入口地址之间建立某种练习,使得cpu根据中断信息可以找到要执行的处理程序。
我们知道,中断信息中包含有标识中断源的类型码。根据cpu的设计,中断类型码的作用就是用来定位中断处理程序。
比如cpu根据中断类型码4,就可以找到4号中断的处理程序。
可随之而来的问题是,若要定位中断处理程序,需要知道它的段地址和偏移地址,而如何根据8位的中断类型码得到中断处理程序的段地址和偏移地址呢?
12.3 中断向量表
cpu用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。
那么什么是中断向量表呢?
中断向量表就是中断向量的列表
中断向量表在内存中保存,其中存放着256个中断源所对应的中断处理程序的入口,如下图所示:
中断向量表在内存中存放,对于8086PC机,中断向量表指定放在内存地址0处
从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表。
12.4 中断过程
从上面的讲解中,我们知道,可以用中断类型码,从中断向量表中找到中断处理程序的入口。
找到这个入口地址的最终目的是用它设置cs和ip,使cpu执行中断处理程序。
用中断类型码找到中断向量,并用它设置cs和ip,这个工作是由cpu的硬件自动完成的。
cpuing硬件完成这个工作的过程被称为中断过程。
在使用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开始执行由程序员编写的中断处理程序。
原文:https://www.cnblogs.com/fate-/p/12968653.html