当前位置:首页 > 网络编程 > 软件语言 > 汇编 > 80386的异常类型

80386的异常类型

点击次数:59 次 发布日期:2008-11-10 08:14:23 作者:源代码网
源代码网推荐
广告载入中
80386的异常类型: 象中断分为多种类型一样,异常也可分为多种类型。1.80386识别的异常 80386识别的多种不同类别的异常及赋予的对应中断向量号如下表所示。某些异常还以出错码的形式提供一些附加信息传递给异常处理程序,出错代码列中的“无”表示没有出错代码,“有”表示有出错代码。

由上表可见,保护模式下的某些中断向量号的分配与实模式的中断向量号发生了冲突。实模式下的中断向量号的分配基于PC微机系统的8086/8088 CPU,上表中的中断向量号的分配是80386所规定的。实际上,Intel在宣布8086/8088时,保留了这些发生冲突的中断向量号。尽管发生这样的冲突,但以80386为CPU的微机系统仍可保持与以8086/8088为CPU的微机系统的兼容,原因是在80386的实模式下,几乎不发生那些中断向量号与外部硬件中断请求时所提供的中断向量号存在冲突的异常。需要注意的是,在保护模式下必须重新设置8259A中断控制器,以产生不与异常相冲突的硬件中断向量。2.故障类异常 当发生故障,控制转移到故障处理程序时,所保存的断点CS及EIP的值指向引起故障的指令,以便在排除故障后恢复执行。(1)除法出错故障(异常0) 除法出错是一种故障。当执行DIV指令或IDIV指令时,如果除数等于0或者商太大,以至于存放商的操作数容纳不下,那么就产生这一故障。除法出错故障不提供出错码。(2)边界检查故障(异常5) 如果BOUND指令发现被测试的值超过了指令中给定的范围,那么就发生边界检查故障。边界检查故障不提供出错码。(3)非法操作码故障(异常6) 如果80386不能把CS和EIP所指向存储单元的位模式识别为某条指令的部分,那么就发生非法操作码故障。当出现如下情况时,发生这样的故障:(1)操作码字段的内容不是一个合法的80386指令代码;(2)要求使用存储器操作数的场合,使用了寄存器操作数;(3)不能被加锁的指令前使用了LOCK前缀。非法操作码故障不提供操作码。(4)设备不可用故障(异常7) 设备不可用故障支持80387数字协处理器。在没有80387协处理器硬件的系统中,可用该异常的处理程序代替协处理器的软件模拟器。在发生任务切换时,使得只有在新任务使用浮点指令时,才进行80387寄存器状态的切换。设备不可用故障不提供出错码。该故障在下列情况下产生:(1)在执行浮点指令时,控制寄存器CR0中的EM位或TS位为1;(2)在执行WAIT指令时,控制寄存器CR0中TS位及EM位都为1。需要注意的是,本异常的处理程序必须是一个过程而不能是任务,否则当处理程序发布一条IRET指令时,80386就设置TS位。然后协处理器再次执行这个发生故障的指令,发现TS是置位的,因此就再次发生异常7,结果是无休止的循环。处理程序能通过陷阱门被调用,因为执行期间可以允许中断。(5)无效TSS故障(异常0AH) 当正从任务状态段TSS装入选择子时,如果发生了除了段不存在故障以外的段异常时,就发生无效TSS故障。在进入故障处理程序时,保存的CS及EIP指向发生故障的指令;或者该故障作为任务切换的一部分发生时,指向任务的第一条指令。 无效TSS故障提供了一个出错码,出错码的格式如下图所示。其中选择子部分是指向引起故障的TSS的选择子。16位的出错代码的主要成分是选择子,指向引起故障的TSS的选择子。高13位是选择子的索引部分,TI位是描述符表指示位。

源代码网推荐

源代码网供稿.
上一篇: 控制转移(2)  下一篇: 80386的中断和异常
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华