FCOM/FCOMP/FCOMPP - 比較實數

操作碼

指令

說明

D8 /2

FCOM m32real

比較 ST(0) 與 m32real

DC /2

FCOM m64real

比較 ST(0) 與 m64real

D8 D0+i

FCOM ST(i)

比較 ST(0) 與 ST(i)。

D8 D1

FCOM

比較 ST(0) 與 ST(1)。

D8 /3

FCOMP m32real

比較 ST(0) 與 m32real,並彈出暫存器堆疊。

DC /3

FCOMP m64real

比較 ST(0) 與 m64real,並彈出暫存器堆疊。

D8 D8+i

FCOMP ST(i)

比較 ST(0) 與 ST(i),並彈出暫存器堆疊。

D8 D9

FCOMP

比較 ST(0) 與 ST(1),並彈出暫存器堆疊。

DE D9

FCOMPP

比較 ST(0) 與 ST(1),並彈出暫存器堆疊兩次。

說明

比較暫存器 ST(0) 的內容與源運算元的值,並根據結果設定 FPU 狀態字中的條件程式碼標誌 C0、C2 及 C3(請參閱下表)。源運算元可以是數據暫存器或記憶體位置。如果沒有給出源運算元,則比較 ST(0) 中的值與 ST(1) 中的值。忽略 0 的符號,因此 -0.0 +0.0。

條件

C3

C2

C0

ST(0) > SRC

0

0

0

ST(0) < SRC

0

0

1

ST(0) SRC

1

0

0

無序*

1

1

1

備註:*如果產生無掩碼算術運算元無效 (#IA) 異常,則不設定標誌。

此指令會檢查比較的數值的類別(請參閱本章中的 FXAM - 檢查)。如果任何一個運算元是 NaN,或是不支援的格式,則觸發算術運算元無效異常 (#IA);如果遮蔽此異常,則條件標誌設定為“無序”。如果未遮蔽算術運算元無效異常,則不設定條件程式碼標誌。

執行比較操作之後,FCOMP 指令彈出暫存器堆疊;執行比較操作之後,FCOMPP 指令彈出暫存器堆疊兩次。要彈出暫存器堆疊,處理器將 ST(0) 暫存器標記為空,並使堆疊指針 (TOP) 遞增 1。

FCOM 指令執行的操作與 FUCOM 指令相同。唯一的區別在於處理 QNaN 運算元的方式。有一個運算元是或兩個運算元都是 NaN,或是不支援的格式時,FCOM 指令觸發算術運算元無效異常 (#IA)。FUCOM 指令執行的操作與 FCOM 指令相同,只是它不會針對 QNaN 產生算術運算元無效異常。

操作

 

CASE (relation of operands) OF
ST > SRC: C3, C2, C0 000;
ST < SRC: C3, C2, C0 001;
ST SRC: C3, C2, C0 100;
ESAC;
IF ST(0) or SRC NaN or unsupported format
THEN
#IA
IF FPUControlWord.IM 1
THEN
C3, C2, C0 111;
FI;
FI;
IF instruction FCOMP
THEN
PopRegisterStack;
FI;
IF instruction FCOMPP
THEN
PopRegisterStack;
PopRegisterStack;
FI;

影響的 FPU 標誌

C1 - 如果發生堆疊下溢,則設定為 1;否則清除為 0。C0、C2、C3 - 請參閱上表。

浮點異常

#IS - 發生堆疊下溢。

#IA - 一個運算元是,或兩個運算元都是 NaN,或是採用不支援的格式。暫存器標記為空。

#D - 一個運算元是,或兩個運算元都是非規格化值。

保護模式異常

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