FST/FSTP - 儲存實數

操作碼

指令

說明

D9 /2

FST m32real

將 ST(0) 複製到 m32real

DD /2

FST m64real

將 ST(0) 複製到 m64real

DD D0+i

FST ST(i)

將 ST(0) 複製到 ST(i)

D9 /3

FSTP m32real

將 ST(0) 複製到 m32real,並彈出暫存器堆疊

DD /3

FSTP m64real

將 ST(0) 複製到 m64real,並彈出暫存器堆疊

DB /7

FSTP m80real

將 ST(0) 複製到 m80real,並彈出暫存器堆疊

DD D8+i

FSTP ST(i)

將 ST(0) 複製到 ST(i),並彈出暫存器堆疊

說明

FST 指令將 ST(0) 暫存器中的值複製到目標運算元,目標運算元可以是記憶體位置或 FPU 暫存器堆疊中的另一個暫存器。將值儲存到記憶體時,值會轉換成單精度或雙精度實數格式。

FSTP 指令先執行同 FST 指令相同的操作,然後彈出暫存器堆疊。爲了彈出暫存器堆疊,處理器將 ST(0) 暫存器標記為空,並使堆疊指針 (TOP) 遞增 1。FSTP 指令還可以按擴充套件的實數格式在記憶體中儲存值。

如果目標運算元是記憶體位置,則運算元指定要儲存的目標值第一個位元組的地址。如果目標運算元是暫存器,則運算元按相對於棧頂的方式指定暫存器堆疊中的一個暫存器。

如果目標大小是單精度或雙精度實數,則要儲存的值的有效位按目標的寬度取整(根據 FPU 控制字的 RC 欄位指定的取整模式),指數會轉換成目標格式的寬度與偏差。如果儲存的值對於目標格式而言太大,則產生數值上溢異常 (#O),並且如果未遮蔽該異常,則不會將任何值儲存到目標運算元。如果要儲存的值是非規格化值,則不產生非規格化異常 (#D)。此情況只當作數值下溢異常 (#U) 情況發出訊號。

如果要儲存的值是 +0、+ 或 NaN,則按適合目標格式的要求,截斷有效位與指數的最低有效位。此操作可以保留值的 0、 或 NaN 標識。

如果目標運算元是非空的暫存器,則不產生操作無效異常。

操作

DEST ST(0);
IF instruction FSTP
THEN
PopRegisterStack;
FI;

影響的 FPU 標誌

C1 - 如果發生堆疊下溢,則設定為 0。如果產生浮點不精確異常 (#P),則表示取整方向:

0 非向上取整;1 向上取整。

C0、C2、C3 - 未定義。

浮點異常

#IS - 發生堆疊下溢。

#IA - 源運算元是 SNaN 值或不支援的格式。

#U - 結果對於目標格式而言太小。

#O - 結果對於目標格式而言太大。

#P - 值無法按目標格式精確表示。

保護模式異常

#GP(0) - 如果目標位於不可寫的段。如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS、或 GS 暫存器用於訪問記憶體,並且它包含空的段選擇器。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果啟用對齊檢查並在目前特權級別為 3 時進行未對齊的記憶體引用。

實地址模式異常

#GP - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS - 如果記憶體運算元有效地址超出 SS 段限制。

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

虛 8086 模式異常

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

#NM - 如果 CR0 中的 EM 或 TS 設定為 1。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。