操作碼 |
指令 |
說明 |
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;
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。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#NM - 如果 CR0 中的 EM 或 TS 設定為 1。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。