汇编语言:浮点数传送指令

时间:2022-02-05 01:28:29

1、FLD

指令格式:

FLD STReg/MemReal

指令功能:

将浮点数据压入协处理器的堆栈中。当进行内存单元内容压栈时,系统会自动决定传送数据的精度。比如:用DD或REAL4定义的内存单元数值是单精度数等。

STReg是处理器堆栈寄存器ST(0)~ST(7)。

例如:

 

.387

data1  DWORD 123, -543

data2  REAL8 -321.5

data3  REAL10 2.5

……

FLD  data1  ;压一个单精度数据进栈

FLD  data2  ;压一个双精度数据进栈

FLD  ST(0)  ;把堆栈寄存器ST(0)的值再压进栈

FLD  data3  ;压一个扩展精度数据进栈

2、FST

 

指令格式:

指令功能:

FST  STReg/MemReal

将协处理器堆栈栈顶的数据传送到目标操作数中。在进行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成相应精度的数据。

3、FSTP

 

指令格式:

FSTP  STReg/MemReal

指令功能:

与FST相类似,所不同的是:指令FST执行完后,不进行堆栈的弹出操作,即:堆栈不发生变化,而指令FSTP执行完后,则需要进行堆栈的弹出操作,堆栈将发生变化。

从上面的浮点传送指令中可以看出,不仅可以对内存变量进行传送,也可以进行寄存器之间的传送,这一点是整型数据以及BCD型数据传送指令所不具有的。

4、FXCH

 

指令格式:

指令功能:

FXCH [STReg]

将指定的寄存器中的浮点数与堆顶浮点数进行交换。如果不指定操作数,那么,默认ST(0)和ST(1)二者之间交换数据。

例如:FXCH  ST(2)  ——  ST(0)与堆栈寄存器ST(2)进行数据交换。

由于FXCH指令隐含ST(0)作为其中的一个操作数,所以其后只需指定一个操作数,但该操作数必须是寄存器,而且不能为ST(0),但是该指令后的寄存器是可选的,如果没有指定寄存器操作数,那么隐含是对ST(1)和ST(0)进行交换。

对数据传送指令的一点总结:它包括三种数据的传送指令,整型,压缩的BCD型以及实型,三种数据的传送有各自的指令集。

压缩的BCD传送指令仅有压栈以及弹栈两条:FBLD以及FBSTP,它们都仅有一个操作数,而且操作数必须是内存操作数的TWORD类型。

整型数据传送指令有三条:FILD、FIST和FISTP,其中后两条是出栈,唯一的区别在于出栈后是否改变(弹出)栈顶数据。它们都仅有一个操作数,而且操作数必须是内存操作数的WORD、DWORD以及QWORD类型,不能为BYTE类型。

相对来讲,实数传送指令比较多,它一共有四条:FLD、FST、FSTP和FXCH。前三条指令的用法与整型类似,只不过用于传送实型数据,而且三条指令不仅支持内存操作数(为REAL4、REAL8和REAL10类型),而且支持寄存器之间的传送。三条指令同样需要一个操作数。而对于FXCH指令,它可以有一个或者没有操作数,但如果有操作数,那么这个参数必须为寄存器。