概述
浮点指令一般需要1个或2个操作数,数据存于浮点数据寄存器或主存中(不能是立即数),主要有3种寻址方式。
1、隐含寻址:操作数在当前数据寄存器顶ST(0)。许多浮点指令的一个隐含(目的)操作数是ST(0);汇编格式中ST等同于ST(0)。这是堆栈结构下操作数的一个特点,常使得汇编语言程序员感到困惑,增加了编写浮点指令程序的难度。
2、寄存器寻址:操作数在指定的数据寄存器栈中ST(i);其中i是相对于当前栈顶ST(0)而言,即i=0~7。
3、存储器寻址:操作数在主存中;主存中的数据可以采用任何存储器寻址方式。1
浮点传送指令浮点数据传送指令完成主存与栈顶ST(0)、数据寄存器ST(i)与栈顶之间的浮点格式数据的传送。浮点数据寄存器是一个首尾相接的堆栈,所以它的数据传送实际上是对堆栈的操作,有些要改变堆栈指针TOP,即修改当前浮点数据寄存器栈顶。
取数指令取数指令FLD从存储器或浮点数据寄存器取得(Load)数据,压入(Push)寄存器栈顶ST(0)。“压栈”的操作是,使栈顶指针TOP减1,数据进入新的栈顶ST(0)。
压栈操作改变了指针TOP指向的数据寄存器,即原来的ST(0)成为现在的ST(1)、原ST(1)为现ST(2)……其他浮点指令实现数据进入寄存器栈都伴随有这个压栈操作。数据进入寄存器栈前由浮点处理单元自动转换成扩展精度浮点数。
存数指令存数指令FST将浮点数据寄存器栈顶数据存入(Store)主存或另一个浮点数据寄存器,寄存器栈没有变化。数据取出后按要求格式自动转换,并在状态寄存器中设置相应异常标志。
存数且出栈指令存数且出栈指令FSTP除执行相应存数指令功能外,还要弹出(Pop)栈顶。“出栈”的操作是:将栈顶ST(O)清空(使对应的标记位等于llB),并使TOP指针加1。
出栈操作改变了指针TOP指向的数据寄存器,即原来的ST(1)成为现在的ST(0)、原ST(2)为现ST(1)……浮点指令集中还有一些这样的执行“出栈”操作的指令,它们的指令助记符都是用P结尾。浮点数据传送指令有一组常数传送指令,它们将浮点运算过程中经常使用的常数按扩展精度压入寄存器栈顶ST(0),例如传送0、1、π等常数的浮点指令依次是FLDZ、FLDl、FLDPI。
浮点交换指令FXCH实现栈顶ST(0)与任一个寄存器ST(i)之间的数据交换。由于许多浮点指令只对栈顶操作,有了这个交换指令,就可以比较方便地对其他数据寄存器单元进行操作了。1
其他浮点指令浮点算术运算指令实现浮点数据的加(FADD)、减(FSUB)、乘(FMUL)、除(FDIV)运算,还包括求绝对值(FABS)、求平方根(FSQRT)和取整(FRNDINT)等指令。
浮点超越函数指令对实数求三角函数、指数和对数等运算,有计算正切(FPTAN)、反正切(FPATAN)、正弦(FSIN)、余弦(FCOS)、正弦和余弦(FSINCOS)、指数(F2XM1)、对数(FYL2X)等指令。
浮点比较指令比较栈顶数据与指定的源操作数,比较结果通过浮点状态寄存器反映。例如,检查浮点数据类型(FXAM)、与零比较(FTST)、浮点数比较指令(FCOM)等指令。
FPU控制指令用于控制和检测浮点处理单元的状态及操作方式。例如,FPU初始化(FINIT)、浮点空操作(FNOP)、保存浮点状态(FSAVE)、设置浮点状态(FRSTOR)等指令。1