整数传送指令
1、FILD
指令格式:FILD MemInt
其中:MemInt是定义为整型数据类型的内存单元,但不能是用DB定义的存储单元。下同,不再叙述。
2、FIST/FISTP
|
指令格式: |
FIST MemInt FISTP MemInt |
其中: |
Mem是定义整型数据类型的内存单元,但不能是用DB定义的存储单元。 |
|
指令功能: |
将协处理器堆栈栈顶的数据传送到目标存储单元中。在进行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成整型数据。 |
指令FIST和FISTP的区别在于堆栈操作,详细请见11.3.1中的命名规则说明。
11.3.3 数学运算指令
在协处理器的指令系统中,有关数学运算指令有:加法指令、减法指令、乘法指令、除法指令和求平方根指令等。涉及数学运算的指令有比例运算、舍入运算、求绝对值运算和改变数值符号运算等指令。
1、加法指令
|
指令格式: |
FADD |
[STReg1, STReg2](*) |
FADD |
MemReal |
||
FADDP |
STReg, ST |
||
FIADD |
MemInt |
(*) 在此指令格式下,如果同时指定了二个堆栈寄存器,那么,其中一个寄存器必须是ST。其它指令的同类格式与此同理。
指令FADD含有二个隐含操作数ST(1)和ST,其运算功能是:从堆栈中弹出这二个操作数,然后把计算的“和”压入堆栈,即:ST=ST(1) ST。
指令“FADD MemReal”的功能:ST=ST MemReal
指令“FADDP STReg, ST”的功能:STReg=STReg ST,并弹出堆栈的栈顶
指令“FIADD MemInt”的功能:ST=ST MemInt
2、减法指令
|
指令格式: |
FSUB |
[STReg1, STReg2] |
|
FSUB |
MemReal |
|||
FSUBP |
STReg, ST |
|||
FISUB |
MemInt |
|||
FSUBR |
[STReg1, STReg2] |
;后四条指令是前四条指令的反模式形式 |
||
FSUBR |
MemReal |
|||
FSUBRP |
STReg,ST |
|||
FISUBR |
MemInt |
指令FSUB含有二个隐含操作数ST(1)和ST,其运算功能是:从堆栈中弹出这二个操作数,然后把计算的“差”压入堆栈,即:ST=ST(1)-ST。
指令“FSUB MemReal”的功能:ST=ST-MemReal
指令“FSUBP STReg, ST”的功能:STReg=STReg-ST,并弹出堆栈的栈顶
指令“FISUB MemInt”的功能:ST=ST-MemInt
反模式的四条指令的功能在此从略,请参阅11.3.1中的有关说明。
3、乘法指令
|
指令格式: |
FMUL |
[STReg1, STReg2] |
FMUL |
MemReal |
||
FMULP |
STReg, ST |
||
FIMUL |
MemInt |
4、除法指令
|
指令格式: |
FDIV |
[STReg1, STReg2] |
|
FDIV |
MemReal |
|||
FDIVP |
STReg, ST |
|||
FIDIV |
MemInt |
|||
FDIVR |
[STReg1, STReg2] |
;后四条指令是前四条指令的反模式形式 |
||
FDIVR |
MemReal |
|||
FDIVRP |
STReg, ST |
|||
FIDIVR |
MemInt |
例如:
|
.387 |
||
word1 |
DW 20 |
||
data1 |
REAL8 8 |
||
data2 |
REAL8 -2 |
||
data3 |
REAL8 -12 |
||
…… |
|||
FLD |
data1 |
;本例只是显示指令的使用方法,无具体的实际功能 |
|
FLD |
data2 |
||
FLD |
data3 |
||
FDIV |
ST(2), ST |
||
FDIV |
data1 |
||
FDIVP |
ST(2), ST |
||
FIDIV |
word1 |
5、其它数学运算指令
在协处理器中,除了完成具体的数学运算指令外,还设置了若干个与数学运算有关的运算指令。具体的运算指令及其功能描述如表11.4所列。
表11.4 与数学运算有关的其它指令
11.3.4 比较运算指令
使用比较指令是将栈顶中的数与其它操作数进行比较,比较结果存于状态寄存器的条件编码位C3~C0处(参阅表11.2)。具体的比较运算指令及其功能描述如表11.5所列。
表11.5 比较运算指令及其功能
指令格式 |
指令的功能 |
FSQRT |
求栈顶数据的平方根。如果对负数求其平方根,则会发生错误,并可通过检测状态寄存器的标志位IE来确定。 |
FSCALE |
将ST(1)中的数(转换成整数)加上ST的阶码,该指令能快速完成乘/除2n的运算。ST(1)中的数必须在2-15到215之间。 |
FPREM/FPREM1 |
ST=ST%ST(1),80387及其以后的协处理器支持FPREM1。 |
FRNDINT |
对栈顶数据进行舍入运算,使之转换成整数。 |
FXTRACT |
将栈顶数据分成二部分:无偏阶码和尾数。尾数存入栈顶,无偏阶码存入ST(1)。它常用将浮点数转换成小数形式打印输出。 |
FABS |
ST=|ST|,即:求栈顶数据的绝对值。 |
FCHS |
ST=-ST,即:改变栈顶数据的符号。 |
11.3.5 超越函数运算指令
超越函数运算指令是用来实现三角函数或一些特殊的算术表达式而设置的,具体的指令及其功能说明如表11.6所列。
表11.6 超越函数运算指令及其功能
指令格式 |
指令的功能 |
FCOM |
将栈顶数据与另一个操作数进行比较,该操作数可以存储在堆栈寄存器中,也可存储在内存中。 当在指令中不指定操作数时,其默认的操作数是ST和ST(1)。 |
FCOMP/FCOMPP |
此指令的比较功能与FCOM相一致,所不同的是指出从堆栈中弹出一个,还是二个数据。 |
FICOM MemInt FICOMP MemInt |
栈顶数据与内存单元进行整数比较。指令FICOMP还要弹出栈顶数据。 |
FUCOM [STReg] FUCOMP [STReg] FUCOMPP |
反向比较,其功能与上面同类指令类似。 |
FTST |
栈顶数据与0进行比较。比较结果对条件编码位的影响如表11.2所示。 |
FXAM |
检测栈顶数据是正数、负数,还是规格化数。比较结果对条件编码位的影响如表11.2所示。 |
11.3.6 常数操作指令
为了计算的方便,协处理器提供了几个将常用常数压栈的指令。如表11.7所示。
表11.7 常数压栈指令及其常数值
指令格式 |
指令的功能 |
FPTAN |
求部分Y/X=tanθ,角度θ存于栈顶,其结果: ST=X,ST(1)=Y (1)、在8087-80287中,角度θ的范围上是0~π/4; (2)、在80387以后的协处理器中,角度θ的范围上是0~263; 如果交度超过其取值范围,则状态IE标定为非法错误。 |
FPATAN |
求部分反正切值θ=arctan(X/Y),X取自ST,Y取自ST(1); 其中:X和Y必须满足:0≤Y<X<∞; 指令执行时进行一次弹出操作,结果存入栈顶。 |
F2XM1 |
求2X-1的值,X取自栈顶,结果也存放栈顶,X的取值范围:-1~1。 |
FCOS或FSIN |
求栈顶ST中角度的正弦或余弦值,ST中存放的是弧度。 运算结果也存于ST。 |
FSINCOS |
求栈顶ST中角度的正弦和余弦值,ST中存放的是弧度。 运算结果:ST=正弦值,ST(1)=余弦值。 |
FYL2X |
计算Ylog2X的值,X=ST,Y=ST(1),其中:X>0。 结果存入有一个弹出操作后的栈顶。 |
FYL2XP1 |
计算Ylog2(X 1)的值,X=ST,Y=ST(1),其中:0<X<1-2-0.5。 结果存入有一个弹出操作后的栈顶。 |