8086系统中、中断类型码、中断向量、中断向量表的关系
5.28086/8088 中断系统 1. 中断类型代码 中断和中断源: 提供中断原因或中断请求的设备称为中断源。• 中断分为两种类型:硬件中断和软件中断。
硬件中断分为两类。
不可屏蔽中断:由NMI PIN引入,不影响中断使能标志,每个系统只允许一个,用于处理紧急情况。
一旦发生此中断,系统立即响应,通过INTR引脚,影响中断使能标志,即只有进入IF=1时才覆盖中断,反之亦然。
可能有多个可以覆盖的中断,通常通过优先级排队,其中选择几个中断源之一进行处理。
②软件中断(内部中断):根据特定指令或标志寄存器中的标志设置而产生。
溢出中断由 INT0 指令引起 断点中断由 INT3 指令引起 单动由标志位 TF ↘ 与指令不匹配引起 除以 0 是由计算结果 ↙ 与指令不匹配产生 • 中断类型代码:8086/8088为每个中断源分配一个中断 Code type ,值为0 ~ 255,即56种中断 可以处理。
其中包括软件中断、系统中断和用户开放中断。
2. 中断向量和中断向量表 系统可以通过多种方式处理中断。
终止。
中断向量:每个中断服务的输入称为中断向量; 查询时,可以查表,确定中断向量,然后传递给相应的中断服务子程序。
8086/8088中断系统中的中断向量表位于0~3FFFH存储位置的0段。
每个中断向量包含四个分量,其中前两个分量存储中断入口地址的偏移量。
处理子程序(IP),低位在前,高位在后; 根据快捷方式类型的数量来准备。
P 参见图 5-14。
图中,shortcut类型代码与shortcut向量空间的关系它表明。
其中00H~04H为专用中断,05H~3FH为系统定义的中断,一般不能由用户定义(有的有固定用途,如MS-DOS中的INT21H图5-14)~FF为用户定义中断。
00H ~ 04H - 系统独占 10H ~ 1FH - BIOS 40H ~ FFH - 用户使用 08H ~ 0FH - 硬件中断 20H ~ 3FH - DOS 中断类型号 * 使用 4 计算中断向量具体中断向量的位置 中断向量表。
例如类型号为20H,则中断向量存储位置为20H*4=80H(中断服务子单元入口地址为4030:2010,则说10H、20H、30H、40.H。
当系统响应中断号20H,会自动找到中断向量对应的截距向量 检测并加载到中断服务中。
3. 中断响应流程和时间 8086/8088 软件中断响应流程不同 IF=1 到达,当前指令执行完毕后,CPU 开始响应外部中断请求,并且外设连接到第二个负极 一个脉冲后,在数据线上发送中断类型码,接收中断类型码后,CPU执行以下功能:①将中断类型码放入临时寄存器TF标志为0。
防止响应中断时出现其他中断 将TF清0可以防止CPU一步执行中断处理部分 由于CPU会自动清除IF标志位,因此如果用户想要插入中断,则必须使用中断指令来重置IF。
因此,维护中断点的任务就是将当前IP和CS的压入堆栈,中断向量表中对应的中断向量,加载到IP和CS中,然后自动传送到中断服务子程序中。
NMI提交的终止请求,其类型代码固定为2因此,CPU不需要读取外设上的代码类型,也不需要计算中断向量表的地址分别到IP和CS。
图5-15是8086/8088中断响应过程的流程图,我们对此图做一些说明: ① 8086/8088除了软件中断外,内部还有“不可屏蔽中断”和“可屏蔽中断”。
与优先事项。
其中(单步除外)——即中断0、1、3、4的优先级高于不可屏蔽中断,不可屏蔽中断高于可屏蔽中断,单级中断有较低的优先级; ,只取终止类型代码,其余无此步骤。
③ 单步中断时,指令每执行一次就中断一次,并将各寄存器的显示给用户参考,直至进入单相中断。
④ 对于排序中断,NMI 总能响应。
⑤提取IP、CS和标志位并返回断点的功能由IRET指令完成。
⑥在某些情况下,即使满足条件,CPU也不能立即响应中断,必须执行下一条指令(而不是当前指令)。
正确执行锁定指令; 执行给SS寄存器值赋值的传送指令,因为一般情况下,为了保证出栈的正确性,需要使用两条连续的指令来给SS和SP寄存器值赋值。
指针。
⑦ 当遇到等待指令或字符串操作指令时,指令执行过程中允许中断。
此时,必须注意维护中断处理子程序中的空间,以保证中断返回后这些指令继续正确执行。
8086系统中,中断类型码、中断向量、中断向量表的关系是什么?
中断类型代码:其实就是中断号,是不同中断服务程序调用中断程序的不同名称标记。中断向量:指向中断服务程序的入口地址。
向量表示的入口地址是4个字节。
中断向量表:由于有多个中断请求,所以就有多个中断服务程序,即有多个中断服务程序存储这些程序。
入口地址(即中断向量)。
为此,系统在内存的特定区域布置了一个中断向量表来存储所有中断向量。
该表就是中断向量表。
以上三者的关系:中断向量=[中断号X4],其中方括号的含义是内存单元的。
(即中断向量表正好存放在绝对内存地址0开头)