1.中断向量表
在实地址模式下,80486 CPU的中断响应是根据中断源提供的中断类型号,查找中断向量表,获取中断向量,继而转去执行中断处理。
中断向量表位于内存底端的1KB RAM区,地址范围为0000H~03FFH,如图6.5所示。256种中断类型由中断类型号0~255(00H~FFH)表示。中断类型号n与其对应中断向量表的地址V的关系是:V=4n。约定4n+0和4n+1单元存放中断服务子程序的偏移地址IP的值,4n+2和4n+3单元存放中断服务子程序的段基址CS的值。CPU响应中断请求后,由中断源自动给出中断类型号n送入CPU,由CPU自动完成向量表地址4n的运算,从向量表中取出中断服务子程序的入口地址送入CS和IP中,将执行的流程控制转移到中断服务子程序。
内部中断的向量地址由系统负责装入,用户不能随意修改。用户中断的向量地址在初始化编程时装入2.设置中断向量
用户在应用系统中使用中断时,需要在初始化程序中将中断服务子程序的入口地址装入中断向量表指定的存储单元中,以便在CPU响应中断请求后,由中断向量自动引导到中断服务子程序。中断向量的设置,既可以使用传送指令直接装入指定单元,也可以使用DOS系统功能调用 INT 21H中的25H号功能调用装入。
(1)用传送指令直接装入
采用这种方法设置中断向量,就是将中断服务子程序的入口地址,通过数据传送指令直接送入中断向量表指定的单元中,即可完成中断向量的设置。例如,设某中断源的中断类型号n为40H,中断服务子程序的入口地址为INT-P,设置中断向量的程序段如下:
CLI ; IF=0, 关中断
MOV AX, 0 ; ES指向0段
MOV ES, AX
MOV BX, 40H×4 ; 向量表地址送BX
MOV AX, OFFSET INT-P ; 中断服务子程序的偏移地址送AX
MOV ES:WORD PTR[BX], AX ; 中断服务子程序的偏移地址写入向量表
MOV AX, SEG INT-P ; 中断服务子程序的段基址送AX
MOV ES:WORD PTR[BX+2],AX ; 中断服务子程序的段基址写入向量表
STI ; IF=1,开中断
…
INT-P: … ; 中断服务子程序
…
IRET ; 中断返回
(2)用DOS系统功能调用装入
在DOS INT 21H系统功能调用中,用25H号功能可设置中断向量,用35H号功能可获取中断向量。
25H号功能调用的入口参数是:
(AH) = 25H
(AL) = 中断类型号
(DS:DX) = 中断服务子程序的入口地址
例如,设某中断的中断类型号n为40H,中断服务子程序的入口地址为INT-P,调用25H号功能装入中断向量的程序段如下:
CLI ; IF=0,关中断
MOV AL, 40H ; 中断类型号40H送AL
MOV DX, SEG INT-P ; 中断服务子程序的段基址送DS
MOV DS, DX
MOV DX, OFFSET INT-P ; 中断服务子程序的偏移地址送DX
MOV AH,25H ; 25H功能调用
INT 21H
STI ; IF=1,开中断
…
INT-P: … ; 中断服务子程序
…
IRET ; 中断返回
35H号功能调用的入口参数是:
(AH) = 35H
(AL) = 中断类型号
出口参数是:
(ES:BX) = 中断服务子程序的入口地址
例如,若从中断类型号为40H对应的向量表中取出中断向量,程序段如下。
MOV AH, 35H
MOV AL, 40H
INT 21H
该程序段执行之后,从向量表中获取的中断向量存放在ES和BX中,ES中存放段基址,BX中存放偏移地址。
在实际应用中,为了不破坏向量表中的原始设置,通常在装入新的中断向量之前,先将原有的中断向量取出保存,待中断处理完毕,再将原中断向量恢复。3.中断处理
当CPU工作在实地址模式下时,可以响应和处理外部中断NMI和INTR,内部中断类型0, 1, 3, 4, 5, 6, 7, 8, 9, 12, 13, 16,共12种异常。
按任务轻重缓急程度,系统规定中断处理的优先顺序是:内部中断优先权最高(类型1单步除外),其次为NMI,再次是INTR,单步中断优先权最低。
实地址模式下的中断处理流程如图6.6所示。
CPU在当前指令执行完毕后,按中断源的优先顺序去检测和查询是否有中断请求,当查询到有内部中断发生时,中断类型号n由CPU内部形成或由指令本身(INT n)提供;当查询到有NMI请求时,自动转入中断类型2进行处理;当查询到有INTR请求时,响应的条件是中断标志位IF=1,其中断类型号n由请求设备在中断响应周期自动给出;当查询到单步请求TF=1时,并且在IF=1时自动转入中断类型1进行处理。对于INTR请求引起的中断,CPU要连续产生两个低电平有效的中断响应周期,进行中断处理。
为了实现中断服务子程序与主程序之间的跳转与返回,CPU在响应中断请求后,执行中断处理前,由硬件自动地完成如下操作:
① 获取中断类型号n,生成中断向量表地址4n。
② 标志寄存器FR的内容压入堆栈保存。
③ 先将IF的值保存在TEMP中,然后将TF和IF清除,在中断响应过程中,禁止单步执行功能和再次响应新的INTR请求。
④ 断点CS:IP压入堆栈保存。
⑤ 从中断向量表地址为4n的存储单元中取出中断向量送入CS和IP,继而转去执行中断服务子程序。断点和标志位的出栈,是在中断服务子程序结束后由中断返回指令IRET来完成的。
为了支持多任务操作和虚拟存储管理,80486 CPU可以工作于保护模式。在保护模式下,为每一个中断和异常定义了一个中断描述符,来说明中断和异常服务程序的入口地址的属性,所有的中断描述符都集中存放在中断描述符表(IDT)中,由中断描述符表取代实地址模式下的中断向量表。
1.中断描述符与中断描述符表
中断描述符又称中断门,它用于描述中断和异常处理程序的属性。
与实地址模式下的中断向量一样,保护模式下的中断描述符也充当引导程序到服务程序初始点执行的指针。不同之处在于,在保护模式下,中断描述符要占据连续的8个字节单元。
中断描述符如图6.7所示:
图6.7 中断描述符
图6.7中低地址的0和1两个字节是中断代码的偏移量A15~A0;高地址的6和7两个字节是中断代码的偏移量A31~A16;
2和3两个字节是段选择符,段选择符和偏移量用来形成中断服务子程序的入口地址;
4和5两个字节称为访问权限字节,它标识该中断描述符是否有效、服务程序的特权级和描述符的类型等信息。
具体描述如下:
P(present):表示中断描述符的有效性。P=1,中断描述符有效;P=0,中断描述符无效。
DPL(descriptor privilege level):表示中断优先级,是系统描述符被访问的特权级,DPL占用2位,有4种编码:00, 01, 10和11,共4级特权级,0级优先级最高。
TYPE:指示中断描述符的不同类型,占用4位,在中断描述符表中有3种类型的描述符:任务门、中断门和自陷门。例如,1110指示32位中断门,1111指示32位自陷门,0101指示32位任务门。
中断描述符表相当于实地址模式下的中断向量表,用于存放中断描述符。表中最多可以包含256个中断描述符,每个中断描述符占用连续的8个字节,因此IDT共占用2KB存储空间,可以放在80486 CPU物理地址空间的任何地方,该表的位置和大小由中断描述符表寄存器IDTR的值确定。
IDTR包含32位的基地址和16位段限,基地址定义中断描述符表IDT在存储器中的起始点,段限定义中断描述符表所占的字节个数。
2.中断调用
保护模式下中断调用过程如图6.8所示。
当CPU响应外部中断请求或执行某条指令产生异常时,根据中断或异常的类型号n,从中断描述符表(IDT)中找到相应的中断门,由中断描述符中的段选择符指向全局描述符表(GDT)或局部描述符表(LDT)中的目标段描述符,此目标段描述符内的段基址指向中断服务子程序代码段的基地址,由该基地址与中断描述符中的偏移量之和形成中断服务子程序的入口地址。
具体实现方法如下:
根据中断类型号n,得到中断门在IDT中的起始地址,
即:起始地址=IDT的基地址+n×8
由中断门中的段选择符,从GDT或LDT中取出段描述符。
根据段描述符中提供的段基址和中断描述符中提供的偏移地址,合成中断服务子程序的入口地址。