FSUB/FSUBP/FISUB - 減法

操作碼

指令

說明

D8 /4

FSUB m32real

從 ST(0) 減去 m32real,結果儲存到 ST(0)

DC /4

FSUB m64real

從 ST(0) 減去 m64real,結果儲存到 ST(0)

D8 E0+i

FSUB ST(0), ST(i)

從 ST(0) 減去 ST(i),結果儲存到 ST(0)

DC E8+i

FSUB ST(i), ST(0)

從 ST(i) 減去 ST(0),結果儲存到 ST(i)

DE E8+i

FSUBP ST(i), ST(0)

從 ST(i) 減去 ST(0),結果儲存到 ST(i),並彈出暫存器堆疊

DE E9

FSUBP

從 ST(1) 減去 ST(0),結果儲存到 ST(1),並彈出暫存器堆疊

DA /4

FISUB m32int

從 ST(0) 減去 m32int,結果儲存到 ST(0)

DE /4

FISUB m16int

從 ST(0) 減去 m16int,結果儲存到 ST(0)

說明

從目標運算元減去源運算元,差值儲存到目標位置。目標運算元總是 FPU 數據暫存器;源運算元可以是暫存器或記憶體位置。記憶體中的源運算元可以是單精度實數、雙精度實數、字整數或短整數格式。

無運算元版的指令從 ST(1) 暫存器的內容減去 ST(0) 暫存器的內容,結果儲存到 ST(1)。單運算元版從 ST(0) 暫存器的內容減去記憶體位置的內容(實數或整數值),結果儲存到 ST(0) 暫存器。雙運算元版從 ST(i) 暫存器的內容減去 ST(0) 暫存器的內容,反之亦然。

執行減法之後,FSUBP 指令執行額外的操作,即彈出 FPU 暫存器堆疊。爲了彈出暫存器堆疊,處理器將 ST(0) 暫存器標記為空,並使堆疊指針 (TOP) 遞增 1。無運算元版的浮點減法指令總是彈出暫存器堆疊。在某些彙編器中,此指令的助記符是 FSUB 而不是 FSUBP。

執行減法之前,FISUB 指令將整型源運算元轉換成擴充套件的實數格式。

下表顯示將各類數值相減時得到的結果(假設未發生上溢或下溢)。這裡,從 DEST 值減去 SRC 值(DEST - SRC 結果)。

同符號運算元之間的差為 0 時,結果是 +0,但在向 - 取整模式中除外,此時結果是 -0。此指令還保證 +0 - (-0) +0 與 -0 - (+0) -0。源運算元為整數 0 時,它被當作 +0。

如果有一個運算元為 ,則結果為 ,符號不變。如果兩個運算元是同符號的 ,則產生操作無效異常。

 

SRC

 

 

 

 

 

Dest

 

-

-F 或 -I

-0

+0

+F 或 +I

+

NaN

-

*

-

-

-

-

-

NaN

-F

+

±F 或 ±0

DEST

DEST

-F

-

NaN

-0

+

-SRC

±0

-0

-SRC

-

NaN

+0

+

-SRC

+0

±0

-SRC

-

NaN

+F

+

+F

DEST

DEST

±F 或 ±0

-

NaN

+

+

+

+

+

+

*

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

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

* 表示浮點算術運算元無效 (#IA) 異常。

操作

IF instruction is FISUB
THEN
DEST DEST - ConvertExtendedReal(SRC);
ELSE (* source operand is real number *)
DEST DEST - SRC;
FI;
IF instruction is FSUBP
THEN
PopRegisterStack
FI;

影響的 FPU 標誌

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

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

C0、C2、C3 - 未定義。

浮點異常

#IS - 發生堆疊下溢。

#IA - 運算元是 SNaN 值或不支援的格式。運算元是同符號的無窮大。

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

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