FMUL/FMULP/FIMUL - 乘法

操作碼

指令

說明

D8 /1

FMUL m32real

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

DC /1

FMUL m64real

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

D8 C8+i

FMUL ST(0), ST(i)

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

DC C8+i

FMUL ST(i), ST(0)

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

DE C8+i

FMULP ST(i), ST(0)

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

DE C9

FMULP

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

DA /1

FIMUL m32int

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

DE /1

FIMUL m16int

將 ST(0) 乘以 m16int,結果儲存到 ST(0)。

說明

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

無運算元版的此指令將 ST(1) 暫存器的內容乘以 ST(0) 暫存器的內容,乘積儲存到 ST(1) 暫存器。單運算元版將 ST(0) 暫存器的內容乘以記憶體位置的內容(實數或整數值),乘積儲存到 ST(0) 暫存器。雙運算元版將 ST(0) 暫存器的內容乘以 ST(i) 暫存器的內容(反之亦然),乘積儲存到第一個運算元(目標運算元)指定的暫存器。

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

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

即使有一個或多個乘數的值為 0 或 ,結果的符號也總是源運算元符號的“異或”。源運算元為整數 0 時,它被當作 +0。

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

 

DEST

 

 

 

 

 

 

 

SRC

 

-

-F

-0

+0

+F

+

NaN

-

+

+

*

*

-

-

NaN

-F

+

+F

+0

-0

-F

-

NaN

-I

+

+F

+0

-0

-F

-

NaN

-0

*

+0

+0

-0

-0

*

NaN

+0

*

-0

-0

+0

+0

*

NaN

+I

-

-F

-0

+0

+F

+

NaN

+F

-

-F

-0

+0

+F

+

NaN

+

-

-

*

*

+

+

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

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

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

操作

IF instruction is FIMUL
THEN
DEST DEST * ConvertExtendedReal(SRC);
ELSE (* source operand is real number *)
DEST DEST * SRC;
FI;
IF instruction FMULP
THEN
PopRegisterStack
FI;

影響的 FPU 標誌

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

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

C0、C2、C3 - 未定義。

浮點異常

#IS - 發生堆疊下溢。

#IA - 運算元是 SNaN 值或不支援的格式。一個運算元是 ±0,另一個是 ±

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