如何引发 32 位浮点错误(通常称为协处理器错误 [INT 16 :8086]。
问问题
197 次
1 回答
2
位 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;
}
x64/i5 / gcc 4.6 / ubuntu 上的输出
浮点异常
于 2013-04-26T10:28:40.017 回答