12 内中断

1、任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来或从内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊的信息,我们称其为:中断信息。中断的意思是指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息

 

2、内中断的产生

当CPU内部有什么事情发生的时候,将产生需要马上处理的中断信息呢?对于8086CPU,当CPU内部有下面情况发生的售后,将产生相应的中断信息

(1)除法错误,比如,执行div指令产生的除法溢出;

(2)单步执行;

(3)执行into指令;

(4)执行int指令

他们4种中断源,在8086CPU中的中断类型码如下。

(1)除法错误:0

(2)单步执行:1

(3)执行into指令:4

(4)执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供给CPU的中断类型码

 

3、中断处理程序

我们知道,中断信息中包含有标识中断源的类型码。根据CPU的设计,中断类型码的作用就是来定位中断处理程序。比如CPU根据中断类型码4,就可以找到4号中断的处理程序。可随之而来的问题是,若要定位中断处理程序,需要知道他的段地址和偏移地址,而如何根据8位的中断类型码得到中断处理程序的段地址和偏移地址呢?

 

4、中断向量表

CPU用7位的中断类型码通过终端像量表找到相应的中断处理程序的入口地址。那么什么是中断向量表呢?中断向量表就是中断向量的列表。那么什么是中断向量呢?所谓中断向量,就是中断处理程序的入口地址。展开来讲,中断向量表就是中断处理程序入口地址的列表

中断向量表在内存中保存,其中存放着256个中断源所对应的中断处理程序的入口,CPU只要知道了中断类型码,姐可以将中断类型码作为中断向量表的表项号,定位相应的表项,从而得到中断处理程序的入口地址

中断向量表在内存中存放,对于8086PC机,中断向量表指定放在内存地址0处。从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表。能不能放在别处呢?不能,如果使用8086CPU,中断向量表就必须放在0000:0000~0000:03FF单元中,这是规定,因为8086CPU就从这个地方读取中断向量表。

那么在中断向量表中,一个表项占多大的哦那关键呢?一个表项存放一个中断向量,也就是一个中断处理程序的入口地址,对于8086CPU,这个入口地址包括段地址和偏移地址,所以一个表项占两个字,高地址字存放段地址,低地址存放偏移地址

 

5、中断过程

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

我们更简洁的描述终端过程,如下:

(1)取得中断类型码N;

(2)pushf

(3)TF=0,IF=0

(4)push CS

(5)push IP

(6)IP = N*4 ,CS = N*4+2

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

 

6、中断处理程序和iret指令

由于CPU随时都可能检测到中断信息,也就是说,CPU随时都可能执行中断处理程序,所以中断处理程序必须一直存储在内存某段空间之中。而中断处理程序的入口地址,即中断向量,必须存储在对应的中断向量表表项中。

中断处理程序的编写方法和子程序的比较相似,下面是常规的步骤:

(1)保存用到的寄存器;

(2)处理终端;

(3)恢复用到的寄存器;

(4)用iret指令返回

iret指令的功能用汇编语法描述为:

pop IP

pop CS

popf

iret通常和硬件自动完成的中断过程配合使用。可以看到,在中断过程中,寄存器入栈的顺序时标志寄存器、CS、IP,而iret的出战顺序是IP、CS、标志寄存器,刚好和其相对应,实现了用执行中断处理程序前的CPU现场恢复标志寄存器和CS、IP的工作。iret指令执行后,CPU回到执行中断处理程序前的执行点继续执行程序

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值