FDIV/FDIVP/FIDIV - 除法

操作碼

指令

說明

D8 /6

FDIV m32real

將 ST(0) 除以 m32real,結果儲存到 ST(0)。

DC /6

FDIV m64real

將 ST(0) 除以 m64real,結果儲存到 ST(0)。

D8 F0+i

FDIV ST(0), ST(i)

將 ST(0) 除以 ST(i),結果儲存到 ST(0)

DC F8+i

FDIV ST(i), ST(0)

將 ST(i) 除以 ST(0),結果儲存到 ST(i)

DE F8+i

FDIVP ST(i), ST(0)

將 ST(i) 除以 ST(0),結果儲存到 ST(i),並彈出暫存器堆疊

DE F9

FDIVP

將 ST(1) 除以 ST(0),結果儲存到 ST(1),並彈出暫存器堆疊

DA /6

FIDIV m32int

將 ST(0) 除以 m32int,結果儲存到 ST(0)。

DE /6

FIDIV m16int

將 ST(0) 除以 m64int,結果儲存到 ST(0)。

說明

將目標運算元除以源運算元,結果儲存到目標位置。目標運算元(被除數)總是 FPU 暫存器,源運算元(除數)可以是暫存器或記憶體位置。記憶體中的源運算元可以是單精度實數、雙精度實數、字整數或短整數格式。

無運算元版的指令將 ST(1) 暫存器的內容除以 ST(0) 暫存器的內容。單運算元版將 ST(0) 暫存器的內容除以記憶體位置的內容(實數或整數值)。雙運算元版將 ST(0) 暫存器的內容除以 ST(i) 暫存器的內容,或者相反。

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

執行除法之前,FIDIV 指令將整型源運算元轉換為成擴充套件型實數格式。源運算元為整數 0 時,它被當作 +0。

如果產生無掩碼除零異常 (#Z),則不儲存任何結果;如果遮蔽該異常,則將帶適當符號的 儲存到目標運算元。

下表顯示將各類數值相除時得到的結果(假設未發生上溢或下溢)。

 

DEST

 

 

 

 

 

 

 

SRC

 

-

-F

-0

+0

+F

+

NaN

-

*

+0

+0

-0

-0

*

NaN

-F

+

+F

+0

-0

-F

-

NaN

-I

+

+F

+0

-0

-F

-

NaN

-0

+

**

*

*

**

-

NaN

+0

-

**

*

*

**

+

NaN

+I

-

-F

-0

+0

+F

+

NaN

+F

-

-F

-0

+0

+F

+

NaN

+

*

-0

-0

+0

+0

*

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

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

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

** 表示浮點除零 (#Z) 異常。

操作

IF SRC = 0
THEN
#Z
ELSE
IF instruction is FIDIV
THEN
DEST DEST / ConvertExtendedReal(SRC);
ELSE (* source operand is real number *)
DEST DEST / SRC;
FI;
FI;
IF instruction FDIVP
THEN
PopRegisterStack
FI;

影響的 FPU 標誌

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

C0、C2、C3 - 未定義。

浮點異常

#IS - 發生堆疊下溢。

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

±∞ / ±∞; ±0 / ±0

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

#Z - DEST / ±0,其中 DEST 不等於 ±0。

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