FADD/FADDP/FIADD - 加法

操作碼

指令

說明

D8 /0

FADD m32real

m32real 與 ST(0) 相加,結果儲存到 ST(0)。

DC /0

FADD m64real

m64real 與 ST(0) 相加,結果儲存到 ST(0)。

D8 C0+i

FADD ST(0), ST(i)

將 ST(0) 與 ST(i) 相加,結果儲存到 ST(0)。

DC C0+i

FADD ST(i), ST(0)

將 ST(i) 與 ST(0) 相加,結果儲存到 ST(i)。

DE C0+i

FADDP ST(i), ST(0)

將 ST(0) 與 ST(i) 相加,結果儲存到 ST(i),並彈出暫存器堆疊

DE C1

FADDP

將 ST(0) 與 ST(1) 相加,結果儲存到 ST(1),並彈出暫存器堆疊

DA /0

FIADD m32int

m32int 與 ST(0) 相加,結果儲存到 ST(0)

DE /0

FIADD m16int

m16int 與 ST(0) 相加,結果儲存到 ST(0)

說明

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

無運算元版的指令將 ST(0) 暫存器的內容加到 ST(1) 暫存器上。單運算元版將記憶體位置的內容(實數或整數值)加到 ST(0) 暫存器的內容上。雙運算元版將 ST(0) 暫存器的內容加到 ST(0) 暫存器的內容上,或者反過來。ST(0) 中的值可以通過編寫以下程式碼翻倍:

FADD ST(0), ST(0);

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

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

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

符號相反的運算元之和為 0 時,結果為 +0,但在向 - 取整模式中除外,此時結果為 -0。源運算元為整數 0 時,它被當作 +0。

兩個運算元是同符號的無窮大時,結果為 ,符號不變。如果兩個運算元為符號相反的無窮大,則產生操作無效異常。

 

 

DEST

 

 

 

 

 

SRC

 

-

-F

-0

+0

+F

+

NaN

-

-

-

-

-

-

*

NaN

-F 或 -I

-

-F

SRC

SRC

±F 或 ±0

+

NaN

-0

-

DEST

-0

±0

DEST

+

NaN

+0

-

DEST

±0

+0

DEST

+

NaN

+F 或 +I

-

±F 或 ±0

SRC

SRC

+F

+

NaN

+

*

+

+

+

+

+

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

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

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

操作

IF instruction is FIADD
THEN
DEST DEST + ConvertExtendedReal(SRC);
ELSE (* source operand is real number *)
DEST DEST + SRC;
FI;
IF instruction FADDP
THEN
PopRegisterStack;
FI;

影響的 FPU 標誌

C1 - 如果發生堆疊下溢,則設定為 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) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。