浮点指令

  对下面的指令先做一些说明: 
st(i):代表浮点寄存器,所说的出栈、入栈操作都是对st(i)的影响 
src,dst,dest,op等都是指指令的操作数,src表示源操作数,dst/dest表示目的操作数 
mem8,mem16,mem32,mem64,mem80等表示是内存操作数,后面的数值表示该操作数的内存位数(8位为一字节) 
x <- y 表示将y的值放入x,例st(0) <- st(0) - st(1)表示将st(0)-st(1)的值放入浮点寄存器st(0)

1.  数据传递和对常量的操作指令

指令格式

 

指令含义

 

执行的操作

 

FLD src

 

装入实数到st(0)

 

st(0) <- src (mem32/mem64/mem80)

 

FILD src

 

装入整数到st(0)

 

st(0) <- src (mem16/mem32/mem64)

 

FBLD src 

 

装入BCD数到st(0)

 

st(0) <- src (mem80)

 

 

 

FLDZ

 

将0.0装入st(0)

 

st(0) <- 0.0

 

FLD1

 

将1.0装入st(0)

 

st(0) <- 1.0

 

FLDPI

 

将pi装入st(0)

 

st(0) <- ?(ie, pi)

 

FLDL2T

 

将log2(10)装入st(0)

 

st(0) <- log2(10)

 

FLDL2E

 

将log2(e)装入st(0)

 

st(0) <- log2(e)

 

FLDLG2

 

将log10(2)装入st(0)

 

st(0) <- log10(2)

 

FLDLN2

 

将loge(2)装入st(0)

 

st(0) <- loge(2)

 

 

 

FST dest

 

保存实数st(0)到dest

 

dest <- st(0) (mem32/mem64)

 

FSTP dest

 

 

 

dest <- st(0) (mem32/mem64/mem80);然后再执行一次出栈操作

 

FIST dest

 

将st(0)以整数保存到dest

 

dest <- st(0) (mem32/mem64)

 

FISTP dest

 

 

 

dest <- st(0) (mem16/mem32/mem64);然后再执行一次出栈操作

 

FBST dest

 

将st(0)以BCD保存到dest

 

dest <- st(0) (mem80)

 

FBSTP dest 

 

 

 

dest<- st(0) (mem80);然后再执行一次出栈操作

 

2.比较指令

指令格式

 

指令含义

 

执行的操作

 

FCOM

 

实数比较

 

将标志位设置为 st(0) - st(1) 的结果标志位

 

FCOM op

 

实数比较

 

将标志位设置为 st(0) - op (mem32/mem64)的结果标志位

 

 

 

FICOM op

 

和整数比较

 

将Flags值设置为st(0)-op 的结果op (mem16/mem32)

 

FICOMP op

 

和整数比较

 

将st(0)和op比较 op(mem16/mem32)后;再执行一次出栈操作

 

 

 

FTST 

 

零检测 

 

将st(0)和0.0比较

 

FUCOM st(i) 

 

 

 

比较st(0) 和st(i)                  [486]

 

FUCOMP st(i)      

 

 

 

比较st(0) 和st(i),并且执行一次出栈操作

 

FUCOMPP st(i)    

 

 

 

比较st(0) 和st(i),并且执行两次出栈操作

 

FXAM  

 

 

 

Examine: Eyeball st(0) (set condition codes)

 

3.运算指令

指令格式

 

指令含义

 

执行的操作

 

加法

 

FADD

 

加实数

 

st(0) <-st(0) + st(1)

 

FADD src

 

 

 

st(0) <-st(0) + src (mem32/mem64)

 

FADD st(i),st

 

 

 

st(i) <- st(i) + st(0)

 

FADDP st(i),st 

 

 

 

st(i) <- st(i) + st(0);然后执行一次出栈操作

 

FIADD src  

 

加上一个整数

 

st(0) <-st(0) + src (mem16/mem32)

 

减法

 

FSUB

 

减去一个实数

 

st(0) <- st(0) - st(1)

 

FSUB src

 

 

 

st(0) <-st(0) - src (reg/mem)

 

FSUB st(i),st

 

 

 

st(i) <-st(i) - st(0)

 

FSUBP st(i),st

 

 

 

st(i) <-st(i) - st(0),然后执行一次出栈操作

 

FSUBR st(i),st

 

用一个实数来减

 

st(0) <- st(i) - st(0)

 

FSUBRP st(i),st

 

 

 

st(0) <- st(i) - st(0),然后执行一次出栈操作

 

FISUB src

 

减去一个整数

 

st(0) <- st(0) - src (mem16/mem32)

 

FISUBR src

 

用一个整数来减

 

st(0) <- src - st(0) (mem16/mem32)

 

乘法

 

FMUL

 

乘上一个实数

 

st(0) <- st(0) * st(1)

 

FMUL st(i)

 

 

 

st(0) <- st(0) * st(i)

 

FMUL st(i),st

 

 

 

st(i) <- st(0) * st(i)

 

FMULP st(i),st

 

 

 

st(i) <- st(0) * st(i),然后执行一次出栈操作

 

FIMUL src

 

乘上一个整数

 

st(0) <- st(0) * src (mem16/mem32)

 

除法

 

FDIV 

 

除以一个实数

 

st(0) <-st(0) /st(1)

 

FDIV st(i)

 

 

 

st(0) <- st(0) /t(i)

 

FDIV st(i),st

 

 

 

st(i) <-st(0) /st(i)

 

FDIVP st(i),st

 

 

 

st(i) <-st(0) /st(i),然后执行一次出栈操作

 

FIDIV src 

 

除以一个整数

 

st(0) <- st(0) /src (mem16/mem32)

 

FDIVR st(i),st

 

用实数除

 

st(0) <- st(i) /st(0)

 

FDIVRP st(i),st

 

 

 

FDIVRP st(i),st

 

FIDIVR src  

 

用整数除

 

st(0) <- src /st(0) (mem16/mem32)

 

 

 

FSQRT

 

平方根

 

st(0) <- sqrt st(0)

 

 

 

FSCALE

 

2的st(0)次方

 

st(0) <- 2 ^ st(0)

 

FXTRACT

 

Extract exponent:

 

st(0) <-exponent of st(0); and gets pushed

 

st(0) <-significand of st(0)

 

 

 

FPREM 

 

取余数

 

st(0) <-st(0) MOD st(1)

 

FPREM1

 

取余数(IEEE),同FPREM,但是使用IEEE标准[486]

 

 

 

 

 

 

 

FRNDINT 

 

取整(四舍五入)

 

st(0) <- INT( st(0) ); depends on RC flag

 

 

 

FABS

 

求绝对值

 

st(0) <- ABS( st(0) ); removes sign

 

FCHS

 

改变符号位(求负数)

 

st(0) <-st(0)

 

 

 

F2XM1

 

计算(2 ^ x)-1

 

 st(0) <- (2 ^ st(0)) - 1

 

FYL2X  

 

计算Y * log2(X)

 

st(0)为Y;st(1)为X;将st(0)和st(1)变为st(0) * log2( st(1) )的值

 

 

 

FCOS

 

余弦函数Cos

 

st(0) <- COS( st(0) )

 

FPTAN

 

正切函数tan

 

st(0) <- TAN( st(0) )

 

FPATAN

 

反正切函数arctan

 

st(0) <- ATAN( st(0) )

 

FSIN

 

正弦函数sin

 

st(0) <- SIN( st(0) )

 

FSINCOS

 

sincos函数

 

st(0) <-SIN( st(0) ),并且压入st(1)

 

st(0) <- COS( st(0) )

 

 

 

 

 

 

 

FYL2XP1 

 

计算Y * log2(X+1)

 

st(0)为Y; st(1)为X; 将st(0)和st(1)变为st(0) * log2( st(1)+1 )的值

 

处理器控制指令

 

FINIT

 

初始化FPU

 

 

 

FSTSW AX

 

保存状态字的值到AX

 

AX<- MSW

 

FSTSW dest

 

保存状态字的值到dest

 

dest<-MSW (mem16)

 

 

 

 

 

 

 

FLDCW src

 

从src装入FPU的控制字

 

FPU CW <-src (mem16)

 

FSTCW dest

 

将FPU的控制字保存到dest

 

dest<- FPU CW

 

 

 

 

 

 

 

FCLEX 

 

清除异常

 

 

 

 

 

 

 

 

 

FSTENV dest

 

保存环境到内存地址dest处 保存状态字、控制字、标志字和异常指针的值

 

FLDENV src

 

从内存地址src处装入保存的环境

 

 

 

FSAVE dest

 

保存FPU的状态到dest处 94字节

 

 

 

FRSTOR src

 

从src处装入由FSAVE保存的FPU状态

 

 

 

 

 

 

 

 

 

FINCSTP

 

增加FPU的栈指针值

 

st(6) <-st(5); st(5) <-st(4),...,st(0) <-?

 

FDECSTP

 

减少FPU的栈指针值

 

st(0) <-st(1); st(1) <-st(2),...,st(7) <-?

 

 

 

 

 

 

 

FFREE st(i)

 

标志寄存器st(i)未被使用

 

 

 

 

 

 

 

 

 

FNOP 

 

空操作,等同CPU的nop

 

st(0) <-st(0)

 

WAIT/FWAIT

 

同步FPU与CPU:停止CPU的运行,直到FPU完成当前操作码

 

 

 

FXCH

 

交换指令,交换st(0)和st(1)的值

 

st(0) <-st(1)

 

st(1) <- st(0)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值