(2)80287的指令举例

  80287使用几十条指令,包括取数指令,存数指令,浮点数比较指令,加减乘除等算术运算指令,某些函数的计算指令等等。我们只举部分指令为例,看80287处理各种数据的有关操作。

  取数指令.操作码的助记忆符为FLD、FILD和FBLD。其中FLD可以用的操作数为三种不同长度浮点数,它用于把主存储器中指定的一个浮点数取来,变其为临时实数(若需要的话)后进栈,相当于一般机器中的PUSH指令,即首先使TOP字段的值减1,把取来的数存入寄存器栈的栈顶寄存器。被取的数为暂时实数时,取来后直接入栈即可,不经变换过程。该指令还能用ST(i)作操作数,把栈内某个寄存器中的内容写入栈顶(此时一定为临时实数)。

  FILD,用于把主存中的三种不同长度整数读来,变换成临时实数后压入寄存器的栈顶。
  FBLD用于把压缩的十进制数串从主存读来,变换成临时实数后压入栈顶。
  取数指令取来的数可以进栈的条件,是栈顶寄存器的状态为空,即相应的TAG为11值。

  存数指令的操作码为FST、FIST和FBST,和与之相应的FSTP、FISTP和FBSTP。尾部不带字符P的三条存数指令,与取数的三条指令相对应.完成的功能是把寄存器栈顶中的数据,从临时实数的形式变成所要求的类型后,再写入主存中去,或用ST(i)形式写入指定的栈寄存器中,此时,栈顶指针和栈顶寄存器的内容、状态均不发生变化。对带字母P的存数指令,在完成存数后,还要执行一项出栈处理,即使栈顶指针(TOP)的内容+1,并使相应的TAG的值变为11。

  浮点数算术运算指令,包括带操作数的和不带操作数的两种格式,不带操作数的指令用栈顶和次栈顶的内容进行运算,结果存入次栈顶,并执行出栈操作。带操作数的指令,操作数可以是主存中的一个数(此时不能为临时实数、长整数或压缩的十进制数串),也可以是寄存器栈中的某个寄存器中的内容。例如:
  FADD ST,ST(i) 完成ST←ST+ST(i)
  FADD ST(i),ST 完成ST(i)←ST(i)+ST
  FADDP ST(i),ST 完成ST(i)←ST(i)+ST,并执行POP操作。
  FIADD存储器地址 完成ST←ST+主存中一数据
  FDIV 存储器地址 完成ST←ST/主存中一数据
  FDIVRP ST(i),ST 完成ST(i)←ST/ST(i),并执行POP操作。

  助记忆符后带字母P,表示操作后执行一次出栈操作。对减与除法运算,助记忆符后带R表示把被减数(或被除数)与减数(或除数)交换运算。

  函数运算指令。80287还直接支持许多函数计算的指令,定义常数的指令等等。函数指令全部无操作数,均使用寄存器栈顶内容、或寄存器栈顶与次栈顶的内容完成计算。例如:
  FSCALT指令,完成ST←ST * 2ST(1)的计算。
  FRNDINT指令,完成对栈顶内容(临时实数)的取整操作,对小数部分的处理由控制字寄存的RC字段控制。
  FABS指令,完成ST←|ST|,即完成求绝对值运算。