111111
精灵王
精灵王
  • 注册日期2010-12-08
  • 发帖数640
  • QQ
  • 火币1103枚
  • 粉丝120
  • 关注75
  • 社区明星
阅读:7528回复:0

经典汇编语言教程:11.2.2 存取状态寄存器

楼主#
更多 发布于:2013-01-29 11:46

对于协处理器中状态寄存器的内容,程序员可用指令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
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

喜欢0 评分0
游客

返回顶部