当前位置: 首页 > 文档资料 > 汇编语言教程 >

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作除数”的错误。

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

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

FSQRT;求协处理器中堆顶数据的平方根
FSTSWAX
TESTAX, 1;测试第0位,即:检测IE是否为1
JNZSQRT_ERR

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

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

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