我想获得并处理X87 FPU溢出/下溢异常但是失败了。
我写了一个测试函数和一个信号处理程序:
void getStatus() {
short status;
__asm__(
"fnstsw %0\n\t":"=m"(status):"m"(status)
);
printf("0x%x\n", status);
}
int fpu(int value) {
int result;
for (int i = 0; i < 9; ++i) {
__asm__(
"fld %0\n\t"::"m"(value)
);
printf("normal\n");
getStatus();
}
__asm__(
"fstp %0\n\t":"=g"(result):"m"(result)
);
return result;
}
void sigHandler(int sig) {
printf("%s\n", "Get An Exception");
getStatus();
return;
}
我在这里遇到两个问题:
1.例外情况不会立即发生。如果我删除了fstp
,那么fld
的浮点异常应该已经完成了9次。但是这没有发生,信号处理程序没有打印出来。只有添加fstp
时,处理程序才能获得信号。并且根据打印状态寄存器,在fld
9次之后设置了异常状态,但没有发送信号。
2.在发送异常信号后,似乎状态寄存器将重新初始化为0。当信号处理程序获得信号时,getStatus
函数始终打印0,然后我无法从状态寄存器中获取哪个异常。
删除“fstp”语句后的输出是:
normal
0x3802
normal
0x3002
normal
0x2802
normal
0x2002
normal
0x1802
normal
0x1002
normal
0x802
normal
0x2
normal
0xffff82c3
结果显示发生了异常,但没有信号。