11.2.2 存取状态寄存器
优质
小牛编辑
133浏览
2023-12-01
对于协处理器中状态寄存器的内容,程序员可用指令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 |