如何在32位中引发浮点错误

Mic*_*cke 5 c assembly intel interrupt x86-16

如何引发32位浮点错误(通常称为协处理器错误[INT 16:8086].

Aki*_*nen 2

来自《装配艺术》,FPU 控制寄存器

位 0 到位 5 是异常掩码。这些类似于 80x86 标志寄存器中的中断允许位。如果这些位包含 1,则 80x87 FPU 会忽略相应的条件。然而,如果任何位包含零,并且发生相应的条件,则 FPU 立即生成中断,以便程序可以处理退化条件。

确保控制寄存器已清除 6 个 lsb,然后产生任何条件。除以零可能是最容易产生的。

int main()
{
    int cw=0;
    asm("fstcw (%0)\n\t"::"r"(&cw):"memory"); cw &= ~0x3f;
    asm("fldcw (%0)\n\t"::"r"(&cw):"memory");
    asm("fldz");  // divide 1 by 0.0 
    asm("fld1");  // or just omit these two loads if you have 387+ :)
    asm("fdivp");
    asm("wait");  // This is mandatory
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

x64/i5/gcc 4.6/ubuntu 上的输出

浮点异常