您的位置:首页 > 编程语言

汇编代码重要性之8088浮点指令

2012-04-06 10:54 92 查看
来自:http://www.360doc.com/content/07/0112/14/7551_327844.shtml

更多:/article/9022325.html

对下面的指令先做一些说明:

st(i):代表浮点寄存器,所说的出栈、入栈操作都是对st(i)的影响

srcdstdestop等都是指指令的操作数,src表示源操作数,dst/dest表示目的操作数

mem8mem16mem32mem64mem80等表示是内存操作数,后面的数值表示该操作数的内存位数(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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: