關於浮點指令
對下面的指令先做一些說明:
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)
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)
相關文章
- 浮點指令
- 關於javascript中對浮點加,減,乘,除的精度分析JavaScript
- 關於JS的浮點數計算精度問題解決方案JS
- 關於tee指令
- 組合語言學習筆記(十二)-浮點指令組合語言筆記
- 您好!關於指令碼指令碼
- 浮點數
- 關於群起kafka指令碼Kafka指令碼
- 有關 PHP 和 js 浮點運算的坑PHPJS
- 關於標題彈出指令
- 浮點數小知識點
- 浮點數的理解
- 關於latch的一點點理解
- 關於難點的思考
- 關於WebWind一點想法Web
- 關於 Bash 指令碼中 Shebang 的趣事指令碼
- 淺談浮點數(一)
- 轉換成浮點數
- [譯]浮點數的危害
- JAVA 字元轉浮點型Java字元
- Java浮點數計算Java
- 關於PHP 的一點點小分享PHP
- React相關知識點:關於ReduxReactRedux
- 關於Solidity指令碼相關環境配置及指令碼資料的查詢Solid指令碼
- ARMCC和GCC編譯ARM程式碼的軟浮點和硬浮點問題GC編譯
- 關於oracle 預設示例scott的指令碼Oracle指令碼
- 關於http斷點續傳那點事HTTP斷點
- 關於模式爭論的一點點思考模式
- js關於物件那點事JS物件
- 關於EditText焦點監聽
- 關於 Cookie的優缺點Cookie
- 關於gdb斷點的真相斷點
- 關於Java的一點想法Java
- 關於crontab 的一點理解
- Java中浮點數的坑Java
- JS中如何理解浮點數?JS
- python處理浮點數Python
- iOS浮點數精度問題iOS