FSCALE - 縮放

操作碼

指令

說明

D9 FD

FSCALE

按 ST(1) 縮放 ST(0)。

說明

將源運算元中的值截斷(向 0)為整數值,然後將該值加到目標運算元的指數上。目標運算元與源運算元是分別位於暫存器 ST(0) 與 ST(1) 的浮點值。此指令提供快速乘以或除以 2 的整數次冪的方法。下表顯示縮放各類數值時得到的結果(假設未發生上溢或下溢)。

備註

F 表示有限實數。N 表示整數。

大多數情況下,只更改指數,底數(有效位)保持不變。不過,ST(0) 中縮放的值是非規格化值時,底數也會發生改變,結果可能會是規格化數。類似地,如果縮放操作發生上溢或下溢,產生的底數將與源運算元的底數不同。

FSCALE 指令也可以用於執行 FXTRACT 指令的逆操作,如下例所示:

FXTRACT;
FSCALE;
FSTP ST(1);

在本例中,FXTRACT 指令從 ST(0) 的值中提取有效位與指數,將它們分別儲存到 ST(0) 與 ST(1)。接著,FSCALE 指令按 ST(1) 中的指數縮放 ST(0) 中的有效位,重新產生執行 FXTRACT 操作之前的原始值。FSTP ST(1) 指令使用重新產生的值覆蓋指數(由 FXTRACT 指令提取),只佔用一個暫存器 [ST(0)] 就將堆疊恢復到原始狀態。

操作

ST(0)<-- ST(0) * 2RoundTowardZero(ST(1));

影響的 FPU 標誌

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

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

C0、C2、C3 - 未定義。

浮點異常

#IS - 發生堆疊下溢。

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

#D - 源運算元是非規格化值。

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

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

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

保護模式異常

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

實地址模式異常

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

虛 8086 模式異常

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