FIST/FISTP - 儲存整數

操作碼

指令

說明

DF /2

FIST m16int

將 ST(0) 儲存到 m16int

DB /2

FIST m32int

將 ST(0) 儲存到 m32int

DF /3

FISTP m16int

將 ST(0) 儲存到 m16int,並彈出暫存器堆疊

DB /3

FISTP m32int

將 ST(0) 儲存到 m32int,並彈出暫存器堆疊

DF /7

FISTP m64int

將 ST(0) 儲存到 m64int,並彈出暫存器堆疊

說明

FIST 指令將 ST(0) 暫存器中的值轉換成有符號整數,並將結果儲存到目標運算元。值可以按字整數或短整數格式儲存。目標運算元指定儲存目標值第一個位元組的地址。

FISTP 指令先執行同 FIST 指令相同的操作,然後彈出暫存器堆疊。爲了彈出暫存器堆疊,處理器將 ST(0) 暫存器標記為空,並使堆疊指針 (TOP) 遞增 1。FISTP 指令也可以按長整數格式儲存值。

下表顯示按整數格式儲存各類數值時得到的結果。

ST(0)

DEST

- 或對於 DEST 格式而言值太大

*

F ≤ −1

-I

-1 < -F < -0

**

-0

0

+0

0

+0 < +F < +1

**

F ≥ +1

+I

+ 或對於 DEST 格式而言值太大

*

NaN

*

備註:F 表示有限實數。I 表示整數。

* 表示浮點操作無效 (#IA) 異常。

** 0 或 ±1,具體取決於取整模式。

如果源運算元值為非整數值,將根據 FPU 控制字的 RC 欄位指定的取整模式,取整為整數值。

如果要儲存的值對於目標格式而言太大、是 、NaN 或不支援的格式,並且算術運算元無效異常 (#IA) 無掩碼,則產生操作無效異常,並且不會將任何值儲存到目標運算元。如果給操作無效異常設定了掩碼,則將無窮大整數值儲存到目標運算元。

操作

DEST Integer(ST(0));
IF instruction FISTP
THEN
PopRegisterStack;
FI;

影響的 FPU 標誌

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

C0、C2、C3 - 未定義。

浮點異常

#IS - 發生堆疊下溢。

#IA - 源運算元對於目標格式而言太大;源運算元是 NaN 值或不支援的格式。

#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) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。