浮點指令


浮點指令

 

  對下面的指令先做一些說明: 
 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) <- ST(0)*(2^ST(1))

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM