对下面指令先做些介绍说明:
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) www. 1.数据传递和对常量操作指令
指令格式2.比较指令
指令含义
执行操作
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);然后再执行次出栈操作
指令格式3.运算指令
指令含义
执行操作
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) ( condition codes)
指令格式[Page]
指令含义
执行操作
加法
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
2st(0)次方
st(0) <- 2 ^ st(0)
FXTRACT
Extract exponent:
st(0) <-exponent of st(0); and gets pushed
st(0) <-signicand of st(0)
FPREM
取余数
st(0) <-st(0) MOD st(1)
FPREM1
取余数(IEEE)同FPREM但是使用IEEE标准[486]
FRNDINT
取整( 4舍 5入)
st(0) <- INT( st(0) ); depends _disibledevent=>
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
空操作等同CPUnop
st(0) <-st(0)
WAIT/FWAIT
同步FPU和CPU:停止CPU运行直到FPU完成当前操作码
FXCH
交换指令交换st(0)和st(1)值
st(0) <-st(1)
st(1) <- st(0)
最新评论