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