日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

X87 FPU 指令集

發布時間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 X87 FPU 指令集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
FPU指令集
(1) FPU數據傳輸指令集
fld將浮點值壓入寄存器棧,源操作數可以是ST(i)或內存地址
fild從內存中讀取一個有符號整型操作數,將該值轉換為擴展雙精度值,并將此結果加載到寄存器棧中
fbld從內存中讀取壓縮BCD操作數,將該值轉換為一個擴展雙精度值,并將結果加載到推棧
fst拷貝ST(0)到ST(i)或內存位置
fstp執行與fst同樣的操作,并且進行彈棧操作
fist將ST(0)中的值轉換為一個整型數,并將結果保存到指定的內存的位置
fistp執行與fist同樣的操作,并且進行彈棧操作
fisttp利用截斷ST(0)中的值轉換為整型數,把結果保存到指定的內存位置,同時彈出推棧本指令在支持SSE3的處理器中才有效
fbstp將ST(0)中的值轉換為組合BCD格式,保存結果到指定的存儲位置,并彈出推棧
fxch交換寄存器ST(O)和ST(i)的內容
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
fcmovcc如果指定條件為真,則有條件地將ST(i)的內容復制到ST(0)。
fcmovcc指令的條件碼
B小于 (CF==1)
NB不小于 (CF==0)
E等于(ZF==1)
NE不等于(ZF==0)
BE小于或等于(CF==1 or ZF ==1)
NBE不小于或等于(CF=0 and ZF==0)
U無序的(PF==1)
NU有序的(PF==0)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(2)FPU基本運算指令集
fadd源操作數和目標操作數相加源操作數可以是內存地址或者FPU寄存器,目標操作數必須是FPU寄存器
faddpST(i)和ST(0)相加,計算結果存入ST(0)中
fsub從目標操作數(被減數)中減去的源操作數(減數),結果存入目標操作數,源操作數可以是內存地址或者FPU寄存器,目標操作數必須是FPU寄存器
fiaddST(0)與指定的整型操作數相加,并把結果存入ST(0)
fsubr從源操作數(被減數)中減去的目標操作數(減數),結果存入目標操作數,源操作數可以是內存地址或者FPU寄存器,目標操作數必須是FPU寄存器
fsubp從ST(i)中減去ST(0),保存差值到ST(i),彈出推棧
fsubrp從ST(0)中減去ST(i),保存差值到ST(i),彈出推棧
fisub從ST(0)中減去指定的整型數操作數,保存差值到ST(0)
fisubr從指定的整型操作數中減去ST(0),保存差值到ST(0)
fmul源操作數和目標操作數相乘,乘積存入目標操作數,源操作數可以是內存地址或者FPU寄存器,目標操作數必須是FPU寄存器
fmulpST(i)和ST(0)相乘,乘積存入ST(i)中,并彈出推棧
fimulST(0)與指定的整型操作數相乘,乘積存入ST(0)中
fdiv目標操作數(被除數)除以源操作數(除數)。源操作數可以是內存地址或者FPU寄存器,目標操作數必須是FPU寄存器
fdivr源操作數(被除數)除以目標操作數(除數)。源操作數可以是內存地址或者FPU寄存器,目標操作數必須是FPU寄存器
fdivpST(i)除以ST(0),商保存到ST(i)中,并彈出推棧
fdivrpST(0)除以ST(i),商保存到ST(i)中,并彈出推棧
fidivST(0)除以指定的整型操作數,商保存ST(0)中
fidivr用指定的整型操作數除以ST(0),商保存到ST(0)中
fprem計算ST(0)除以ST(1),得到的余數存入ST(0)。這條指令常用在計算余數的循環中
fpreml類似 fprem 指令 不過計算余數的時候用的是IEEE754 標準指定的算法
fabs計算ST(0)的絕對值,并將結果存入ST(0)中
fchs補充ST(0)的符號位,并將結果保存到ST(0)
frndint對ST(0)中的值舍入到最近的整型數,將結果存入ST(0)中,使用FPU控制字中的RC位域來指定舍入的方式
fsqrt計算ST(0)的平方根,結果存入ST(0)
fxtract分離ST(0)的指數部分和有效數部分,執行完指令后,ST(0)中包含有效數,ST(1)中包含指數
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(3)FPU數據比較指令
fcom比較ST(0)與ST(i),或者比較ST(0)與內存操作數,同時基于比較結果設置FPU條件碼標志
fcomp和(fcompp)比較ST(0)與ST(i),或者比較ST(0)與內存操作數,設置FPU條件碼標志,同時彈出推棧 。 (fcompp 指令進行倆次彈棧)
fucom執行ST(0)和ST(i)的無序比較操作,根據結果設置FPU條件碼標志
fucomp和(fucompp)執行ST(0)與ST(i)的無序比較操作,設置FPU條件碼標志,并彈出推棧(fucompp 彈棧倆次)
ficom比較ST(0)與內存中的整型操作數,根據FPU條件碼標志
ficomp比較ST(0)與內存中的整型操作數,設置FPU條件碼標志,同時彈出推棧
fcomi比較ST(0)與ST(i),同時根據結果直接設置EFLAGS.CF,EFLAGS.PF和EFLAGS.ZF
fcomip執行與fcomi指令同樣操作,同時彈出推棧
fucomi執行ST(0)與ST(i)的無序比較操作,同時根據結果直接設置EFLAGS.CF,EFLAGS.PF和EFLAGS.ZF
fucomip執行與fucomi指令同樣的操作,同時彈出推棧
ftst比較ST(0)與0.0,根據結果設置FPU條件碼標志
fxam檢查ST(0)并設置FPU條件碼標志,表明值所屬的類,可能的類非規范數,空狀態,無窮大,NaN,正常有限數,不支持的格式和0
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(4)FPU超越函數指令集
fsin計算ST(0)的正弦值并將結果存入ST(0)中
fcos計算ST(0)的余弦值并將結果存入ST(0)中
fsincos計算ST(0)的正弦值和余弦值,執行完指令后,ST(0)和ST(1)中分別包含源操作數的正弦和余弦值
fptan計算ST(0)的正切值并將結果存入ST(0)中,同時將常數1.0壓入推棧
fpatan計算ST(0)除以ST(0)的反正切值,同時將結果存入ST(0)中
f2xm1計算2^(ST(0)-1)同時把結果存入ST(0),源操作數的值必須在-1.0 到+1.0之間
fy12x計算ST(1)*log2(ST(0)),結果存入ST(1),并彈出推棧
fy12xp1計算ST(1)*log2(ST(0)+1.0),結果存入ST(1),并彈出推棧
fscale截斷(向0舍入)ST(1)的值,并將此值與ST(0)的指數部分相加,這指令用來對2的整數冪做快速乘除計算
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(5)FPU常量指令集
fld1把常數+1.0壓入FPU寄存器棧
fldz把常數+0.0壓入FPU寄存器棧
fldpi把常數 π 壓入FPU寄存器棧
fldl2e把常數值log2(e)壓入FPU寄存器棧
fldln2把常數值ln(2)壓入FPU寄存器棧
fld2t把常數log2(10)壓入FPU寄存器棧
fldlg2把常數log10(2)壓入FPU寄存器棧
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
(6)FPU控制指令集
finit和 (fninit)初始化FPU至缺省狀態
fincstp通過對FPU狀態字中的TOS域加1,更改當前的推棧指針位置,FPU數據寄存器和標記字的內容不被修改,也就是說,改指令不等用于入棧,此指令可用于手動管理FPU寄存器棧
fdecstp通過對FPU狀態字中的TOS域減1,更改當前的推棧指針位置,FPU數據寄存器和標記字的內容不被修改,也就是說,改指令不等用于入棧,此指令可用于手動管理FPU寄存器棧
ffree通過設置相應的標記字狀態為空,釋放FPU浮點寄存器
flcdw從指定的內存位置加載FPU控制字
fstcw 和(fmstcw)把FPU控制字保存到指定的內存位置
fstsw和(fnstsw)把FPU狀態字保存到AX寄存器或者內存位置
fclex和(fnclex)清除以下FPU狀態字位:PE,UE,OE,ZE,DE,IE,ES,SF和B。執行完此指令后,條件碼標志C0,C1,C2和C3處于未定義狀態
fstenv和(fnstenv)把當前FPU執行環境保存到內存,包括控制字,狀態字,標記字,FPU數據指針,FPU指令指針和FPU最后一條指令操作碼
fldenv從內存中加載FPU執行環境
fsave和(fnasve)保存當前FPU運行狀態,包括所有數據寄存器的內容和以下項:控制字,狀態字,標記字,FPU數據指針,FPU指令指針和FPU最后一條指令操作數碼
frstor從內存中加載FPU的運行狀態
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
FPUCMOV移動指令
fcmovb如果st(0)小于st(x),則進行傳送
fcmove如果st(0)等于st(x),則進行傳送
fcmovbe如果st(0)小于或等于st(x),則進行傳送
fcmovu如果st(0)無序,則進行傳送
fcmovnb如果st(0)不小于st(x),則進行傳送
fcmovne如果st(0)不等于st(x),則進行傳送
fcmovnbe如果st(0)不小于或等于st(x),則進行傳送
fcmovnu如果st(0)非無序,則進行傳送

總結

以上是生活随笔為你收集整理的X87 FPU 指令集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。