操作碼 |
指令 |
說明 |
DF /6 |
FBSTP m80bcd |
將 ST(0) 儲存到 m80bcd,並彈出 ST(0)。 |
將 ST(0) 暫存器中的值轉換成 18 個數字的壓縮 BCD 整數,結果儲存到目標運算元,並彈出暫存器堆疊。如果源運算元的值不是整數值,將根據 FPU 控制字的 RC 欄位指定的取整模式取整為整數值。要彈出暫存器堆疊,處理器將 ST(0) 暫存器標記為空,並使堆疊指針 (TOP) 遞增 1。
目標運算元指定儲存目標值第一個位元組的地址。BCD 值(包括它的符號位)在記憶體中需要 10 個位元組的空間。
下表顯示按壓縮 BCD 格式儲存各類數值時得到的結果。
ST(0) |
DEST |
- 或對於 DEST 格式而言值太大 |
* |
F ≤ −1 |
-D |
-1 < -F < -0 |
** |
-0 |
-0 |
+0 |
+0 |
+0 < +F < +1 |
** |
F ≥ +1 |
+D |
+ 或對於 DEST 格式而言值太大 |
* |
NaN |
* |
備註:F 表示有限實數。D 不是壓縮 BCD 數。* 表示浮點操作無效 (#IA) 異常。** 表示 ±0 或 ±1,具體取決於取整模式。
如果轉換后的值對於目標格式而言太大,或如果源運算元是 ∞、SNaN、QNAN 或不支援的格式,則發出算術運算元無效條件訊號。如果未遮蔽操作無效異常,則產生算術運算元無效異常 (#IA),並且不會將任何值儲存到目標運算元。如果遮蔽操作無效異常,則將無窮大壓縮 BCD 值儲存到記憶體。
DEST BCD(ST(0));
PopRegisterStack;
C1 - 如果發生堆疊下溢,則設定為 0。如果產生不精確異常 (#P),則表示取整方向:
0 = 非向上取整;1 向上取整。
C0、C2、C3 - 未定義。
#IS - 發生堆疊下溢。
#IA - 轉換長度超出 18 個 BCD 數字的值。
源運算元是 SNaN、QNaN、±∞ 或不支援的格式。
#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。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。