获取并处理X87 FPU溢出/下溢异常

时间:2018-04-08 09:04:16

标签: linux assembly signals x86-64 fpu

我想获得并处理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

结果显示发生了异常,但没有信号。

0 个答案:

没有答案