X87 FPU 指令集
生活随笔
收集整理的這篇文章主要介紹了
X87 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寄存器 |
| faddp | ST(i)和ST(0)相加,計算結果存入ST(0)中 |
| fsub | 從目標操作數(被減數)中減去的源操作數(減數),結果存入目標操作數,源操作數可以是內存地址或者FPU寄存器,目標操作數必須是FPU寄存器 |
| fiadd | ST(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寄存器 |
| fmulp | ST(i)和ST(0)相乘,乘積存入ST(i)中,并彈出推棧 |
| fimul | ST(0)與指定的整型操作數相乘,乘積存入ST(0)中 |
| fdiv | 目標操作數(被除數)除以源操作數(除數)。源操作數可以是內存地址或者FPU寄存器,目標操作數必須是FPU寄存器 |
| fdivr | 源操作數(被除數)除以目標操作數(除數)。源操作數可以是內存地址或者FPU寄存器,目標操作數必須是FPU寄存器 |
| fdivp | ST(i)除以ST(0),商保存到ST(i)中,并彈出推棧 |
| fdivrp | ST(0)除以ST(i),商保存到ST(i)中,并彈出推棧 |
| fidiv | ST(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的運行狀態 |
| - | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| FPU | CMOV移動指令 |
| 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 指令集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 精品软件,《分享精彩应用
- 下一篇: 程序员团队名称和口号_这50个团建活动的