關於浮點指令

dtstudio2012發表於2012-12-03
對下面的指令先做一些說明: 
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)
 

相關文章