這是來自 Intel 64 and IA-32 Architectures Software Developer's Manuals的第2卷的所有內容。
FCOMI
只設置一些CMP
所做的標誌。您的代碼有%st(0) == 9
和%st(1) == 10
。 (因爲它是一個堆棧,所以它們被加載到),參考第2A卷第3-348頁的表格,你可以看到這是「ST0 < ST(i)」的情況,所以它將清除ZF和PF並設置CF.同時在第pg。 3-544 Vol。 2A,你可以看到JG
的意思是「如果更大(ZF = 0和SF = OF)跳躍短路」。換句話說,它正在測試符號,溢出和零標誌,但FCOMI
沒有設置符號或溢出!
根據您希望跳轉的條件,您應該查看可能的比較結果並決定何時跳轉。
+--------------------+---+---+---+
| Comparison results | Z | P | C |
+--------------------+---+---+---+
| ST0 > ST(i) | 0 | 0 | 0 |
| ST0 < ST(i) | 0 | 0 | 1 |
| ST0 = ST(i) | 1 | 0 | 0 |
+--------------------+---+---+---+
我做了這個小桌子,使其更容易弄清楚:
+--------------+---+---+-----+------------------------------------+
| Test | Z | C | Jcc | Notes |
+--------------+---+---+-----+------------------------------------+
| ST0 < ST(i) | X | 1 | JB | ZF will never be set when CF = 1 |
| ST0 <= ST(i) | 1 | 1 | JBE | Either ZF or CF is ok |
| ST0 == ST(i) | 1 | X | JE | CF will never be set in this case |
| ST0 != ST(i) | 0 | X | JNE | |
| ST0 >= ST(i) | X | 0 | JAE | As long as CF is clear we are good |
| ST0 > ST(i) | 0 | 0 | JA | Both CF and ZF must be clear |
+--------------+---+---+-----+------------------------------------+
Legend: X: don't care, 0: clear, 1: set
換句話說條件碼匹配那些使用無符號比較。如果您使用FMOVcc
,也是如此。
如果fcomi
的任一個(或兩個)操作數是NaN,則它設置ZF=1 PF=1 CF=1
。 (FP比較有4個可能的結果:>
,<
,==
或無序)。如果你關心你的代碼如何處理NaN,你可能需要額外的jp
或jnp
。但並非總是如此:例如,只有當CF = 0且ZF = 0時,ja
才爲真,因此它在無序情況下不會被採用。如果你想讓無序的情況下采取相同的執行路徑或相同的,那麼ja
是你所需要的。
這裏你應該用JA
如果你想它來打印(即if (!(f2 > f1)) { puts("hello"); }
)和JBE
如果不這樣做(相當於if (!(f2 <= f1)) { puts("hello"); }
)。 (請注意,這可能有點令人困惑,因爲我們只在沒有跳轉時纔打印)。
關於你提到的第二個問題:在默認情況下fcomi
不會彈出任何東西。你想要它的親戚fcomip
它彈出%st0
。你應該總是在使用後清除fpu寄存器堆棧,因此所有的程序都會以這種方式結束,假設你想要打印的消息:
.section .rodata
msg: .ascii "Hallo\n\0"
f1: .float 10.0
f2: .float 9.0
.globl main
.type main, @function
main:
flds f1
flds f2
fcomip
fstp %st(0) # to clear stack
ja leb # won't jump, jbe will
pushl $msg
call printf
addl $4, %esp
leb:
pushl $0
call exit
非常令人印象深刻的答案。優秀。一個小小的評論:「ja」的反面是「jbe」,而不是「jb」。 –
@Ray Toal:你是對的。儘管在這種情況下它沒有任何區別,但我改變了這個例子,因爲這樣做更有意義。 – user786653
不錯!十分感謝! – JustMaximumPower