对于协处理器中状态寄存器的内容,程序员可用指令FSTSW把其值送到内存单元中。如果当前使用的是80287及其以后的协处理器,那么,可用指令“FSTSW AX”把该状态寄存器的值传送给通用寄存器AX。一旦状态寄存器的值复制到内存或AX中,那么,就可对其各位进行分析,并可检测出当前协处理器的工作状态。

对于80287协处理器,它还可通过I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而80387~Pentium系列芯片,则是通过I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。

当状态寄存器的内容传给AX之后,一般可用下面二种方法来检测协处理器的状态。

方法1:用TEST指令来检测其相应的状态位。

例11.3 检测是否有“0作除数”的错误。 

FDIV    DATA1  ;用协处理器中堆顶数据去除DATA1
FSTSW  AX    ;把状态寄存器的值传送给AX
TEST  AX, 4   ;测试第2位,即:检测ZE是否为1
JNZ DIV_ERR

例11.4 检测是否有“非法操作数”的错误。 

FSQRT ;求协处理器中堆顶数据的平方根
FSTSW AX
TEST AX, 1 ;测试第0位,即:检测IE是否为1
JNZ SQRT_ERR

方法2:用SAHF指令把AX的低字节传送给CPU的标志位寄存器,然后再用条件转移指令来完成相应的检测。 

例11.5 检测内存单元的数据与协处理器堆顶数据之间的大小关系。 

FCOM DATA1 ;内存单元DATA1的值与协处理器堆顶数据进行比较
FSTSW AX
SAHF ;把AX的低字节存入CPU的状态寄存器
JE ST_EQUAL  ;具体大小关系的决定可见表11.2中的“FCOM”
JB ST_BELOW
JA ST_ABOVE