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

最佳答案

Art of Assembly, FPU Control Register



确保清除了控制寄存器的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;
}

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

10-07 20:10