C 如何引发32位的浮点错误

C 如何引发32位的浮点错误,c,assembly,intel,interrupt,x86-16,C,Assembly,Intel,Interrupt,X86 16,如何引发32位浮点错误(通常称为协处理器错误[INT 16:8086])。 位0到5是异常掩码。它们类似于80x86的标志寄存器中的中断启用位。如果这些位包含1,则80x87 FPU将忽略相应的条件。但是,如果任何位包含0,并且出现相应的条件,则FPU将立即生成中断,以便程序am可以处理退化条件 确保控制寄存器清除了6个LSB,然后产生任何条件。除零可能是最容易产生的 int main() { int cw=0; asm("fstcw (%0)\n\t"::"r"(&cw

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

位0到5是异常掩码。它们类似于80x86的标志寄存器中的中断启用位。如果这些位包含1,则80x87 FPU将忽略相应的条件。但是,如果任何位包含0,并且出现相应的条件,则FPU将立即生成中断,以便程序am可以处理退化条件

确保控制寄存器清除了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/gcc4.6/ubuntu上的输出

浮点异常


免责声明--我不理解“32位”部分.在386+上,虽然堆栈溢出/下溢有额外的异常。当fp-stack中可能没有值时,调用例如fdivp,下溢应该是可行的。Aki,在您的评论中,您是指486+?还是协处理器?我是指80387协处理器。它的前身没有溢出异常。但我仍然没有得到要求对于32位。明白了,谢谢。我想32位的要求使得任务无法解决,因为可能需要一个只涉及非FP指令的解决方案。什么情况促使你这么问?像我这样的人通常希望非浮点指令不会有浮点效应。