AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

80386的异常类型

51自学网 http://www.51zixue.net
 

(7)堆栈段故障(异常0CH)

    当处理器检测到用SS寄存器进行寻址的段有关的某种问题时,就发生堆栈段故障。在进入故障处理程序时,保存的CS及EIP指向发生故障的指令;或者该故障作为任务切换的一部分发生时,指向任务的第一条指令。堆栈段故障提供一个出错码,出错码的格式也如上图。
    具体地说,当出现下列三种情况时,将引起堆栈段故障:
    (1)在堆栈操作时,偏移超出段界限所规定的范围。这种情况下的出错码是0。例如PUSH操作时,堆栈溢出。
    (2)在由特权级变换所引起的对内层堆栈的操作时,偏移超出段界限所规定的范围。这种情况下的出错码包含有内层堆栈的选择子。
    (3)装入到SS寄存器(高速缓冲寄存器)的描述符中的存在位为0。这种情况下的出错码包含有对应的选择子。
    上述第一种情况是容易辨别的。第二和第三种情况的辨别要通过判断出错代码所含选择子所指示的描述符中的存在位进行。如果存在位为1,那么是第二种情况;否则是第三种情况。

(8)通用保护故障(异常0DH)

    除了明确列出的段异常外,其它的段异常都被视为通用保护故障。在进入故障处理程序时,保存的CS及EIP指向发生故障的指令;或者该故障作为任务切换的一部分发生时,指向任务的第一条指令。通用保护故障提供一个出错码,出错码的格式也如上图所示。
    根据处理程序可能作出的响应,通用保护故障可分为如下两类:
    (1)违反保护方式,但程序无须中止的异常。这类故障提供的出错码为0。这种异常在应用程序执行特权指令或I/O访问时发生,支持虚拟8086程序的系统或支持虚拟I/O访问的系统需要模拟这些指令,并在模拟完成产生故障的指令后,重新执行被中断的程序。
    (2)违反保护方式,并导致程序终止的异常。这类故障提供的出错码可能为0,也可能不为0(能确定选择子时)。引起这类故障的一些原因如下:
    向某个只读数据段或代码段写;
    从某个只能执行的代码段读出;
    将某个系统段描述符装入到数据段寄存器DS、ES、FS、GS或SS;
    将控制转移到一个不可执行的段;
    在通过段寄存器CS、DS、ES、FS或GS访问内存时,偏移超出段界限;
    当访问某个描述符表时,超过描述符表段界限;
    把PG位为1但PE位为0的控制信息装入到CR0寄存器;
    切换到一个正忙的任务。
    对上述两类通用保护故障的辨别,可通过检查引起故障的指令和出错码进行。如果出错码非0,那么肯定是第二类通用保护故障。如果出错码是0,那么需要进一步检查引起故障的指令,以确定它是否是系统支持的可以模拟的指令。

(9)页故障(异常0EH)

    关于页故障的详细说明请见后面的文章。

(10)协处理器出错(异常10H)

    协处理器出错故障指示协处理器发生了未被屏蔽的数字错误,如上溢或下溢。在引起故障的浮点指令之后的下一条浮点指令或WAIT指令,把协处理器出错作为一个故障通知给系统。协处理器出错故障不提供出错码。

3.陷阱类异常

(1)调试陷阱(异常1)

    调试异常有故障类型,也有陷阱类型。调试程序可以访问调试寄存器DR6,以确定调试异常的原因和类型。调试异常不提供出错码。

(2)单字节INT3(异常3)

    INT3是一条特别的单字节“INT n”指令。调试程序可利用该指令支持程序断点。INT3指令被看成是一种陷阱,而不是一个中断。当由于执行INT3指令进入异常3处理程序时,被保存的CS和EIP指向紧跟INT3的指令,即INT3后面的字节。INT3陷阱不提供出错码。

(3)溢出(异常4)

    INTO指令提供条件陷阱。如果OF标志为1,那么INTO指令产生陷阱;否则不产生陷阱,继续执行INTO后面的指令。在进入溢出处理程序时,被保存的CS和EIP指向INTO指令的下一条指令。溢出陷阱不提供出错码。

4.中止类异常

(1)双重故障异常(异常8)

    当系统正在处理一个异常时,如果又检测到一个异常,处理器试图向系统通知一个双重故障,而不是通知第二个异常。双重故障属于中止类异常,所以在转入双重故障处理程序时,被保存的CS和EIP可能不指向引起双重故障的指令,而且指令的重新启动不支持双重故障。双重故障提供的出错码为0。
    当正处理一个段故障异常时,有可能又产生一个页故障。在这种情况下,通知给系统的是一个页故障异常而不是双重故障异常。但是,如果正处理一个段故障或页故障时,又一个段故障被检测到;或者如果正处理一个页故障时,又一个页故障被检测到,那么就引起双重故障。
    当正处理一个双重故障时,又一个段或页故障被检测到,那么处理器暂停执行指令,并进入关机方式。关机方式类似于处理器指令一条HLT指令后的状态:处理器空转,并维持到处理器接收到一个NMI中断请求或者被重新启动为止。在关机方式下,处理器不响应INTR中断请求。
    双重故障通常指示系统表出现严重的问题,例如段描述符表、页表或中断描述符表出现问题。双重故障处理程序在重建系统表后,可能不得不重新启动操作系统。

(2)协处理器段越界(异常9)

    协处理器段越界异常属于中止类异常,这是因为引起该异常的指令不能被重新启动。当浮点指令操作数超出段界限时,产生该中止异常。协处理器段越界异常不提供出错码。在异常处理程序入口保存的CS及EIP指向被中止的指令。这种中止不是系统的中止,而是只影响检测到这种异常时正执行的指令所在的程序。

 
 

上一篇:实模式和任何特权级下可执行的指令  下一篇:8086/8088指令系统