1. 内中断的产生:
1) 中断是指一种特殊的信息,一旦CPU收到中断信息就必须暂停当前的工作并转去执行处理该信息的代码(有时可以选择性地屏蔽中断信息),处理完成之后再回复中断前的环境并继续执行中断前的任务;
2) 内中断和外中断:
i. 内中断是指从CPU内部发出的中断信息,具体说就是指当前CPU正在执行的任务自己产生的中断,这种中断是无法屏蔽的(由于是CPU内部产生的,CPU只能屏蔽来自外部的中断);
ii. 外中断是指从CPU外部向CPU发出的中断信息,具体说就是非当前正在执行的任务产生的中断信息,这句话听起来很费解,可以这样理解,因为一切不是当前CPU正在执行的都不能叫做任务,也就是说来自外部的中断只能是由I/O设备产生的,因此外中断是由CPU外部的外设产生的;
!注意:回忆一下组成原理中的概念,微机就是指CPU和MM组成MPU,一切和它相连的都属于外设,而主存MM不会产生中断(在功能是是和CPU紧密相连的),因此一般意义上讲,CPU之外的(除了MM)都属于外设;
iii. 内中断无法屏蔽而外中断可以选择性屏蔽,主要是靠SF的标志位IF(即Interrupt Flag,中断允许标志),如果为1表示允许接受中断,为0就表示屏蔽中断,但也有不可屏蔽的外部中断(这类中断往往是非常紧急的事件);
3) 内中断产生的原因:主要有4类
i. 除法错误(执行div指令等发生溢出,不一定是除0异常,也可以是一个很大的数除以一个很小的数);
ii. 单步调试(即很多调试程序的单步调试功能,像Debug的T命令等);
iii. 执行into指令(这里不对这个做介绍);
iv. 著名的int指令,其实就是内部中断的一般化方式,可以由int指令产生上述所有类型的内部中断;
4) 中断类型码:
i. 用于识别中断的类型,严谨地说是用于识别中断源(即产生中断的事件);
ii. 每种类型的中断都有不同的含义,因此不同中断的处理方法也不同,所以要为终端类型编码;
iii. 这里用1个Byte对中断类型编码,称为中断类型码,因此最多只能有256种中断类型码;
iv. 上述4种内部中断的类型码分别为0、1、4和int n,其中int n中的n就是中断类型码,它可以指定为1Byte的任意数值,因此也可以通过int 0、int 1等产生除法错误、单步调试等所有的中断,因此int n是一种中断的一般化方式;
2. 中断向量表:
1) 一般中断的处理步骤中必然要有跳转去执行中断处理程序的步骤,因此需要通过中断类型码来获取中断处理程序的入口处地址;
2) 中断向量表:就是一张记录中断处理程序入口处指向的表,对于80X86CPU来说,中断向量表存放在内存地址0处,然后两个字存放一个中断向量(包括段地址和偏移地址,即一个中断处理程序的入口处地址),中断发生时就是根据中断类型码n(也就是中断向量表中的字索引)在中断向量表中找到相应的中断处理程序的入口处地址,然后在根据改地址修改cs:ip转去执行相应的中断处理程序;
3) 向量表中每一项(即两个字)都存放了一个中断处理程序的cs:ip值,高地址存放段地址,低地址存放偏移地址,表项按字进行索引,比如0号字存放0号中断的向量