測試條件
為了使用條件跳轉,必須測試條件。此處測試條件僅指檢查標誌的行為,實際跳轉在條件跳轉下描述。
x86 依賴於 EFLAGS 暫存器來測試條件,該暫存器包含每個指令可能設定的一組標誌。
算術指令,如 sub
或 add
,以及邏輯指令,如 xor
或 and
,顯然是設定標誌。這意味著標誌 CF , OF , SF , ZF , AF , PF 被這些指令修改。允許任何指令修改標誌,例如 cmpxchg
修改 ZF 。
始終檢查指令參考以瞭解特定指令修改了哪些標誌。
x86 有一組條件跳轉,前面提到過,當且僅當某些標誌被設定或某些標誌被清除或兩者都被跳轉時才跳轉。
標誌
算術和邏輯運算在設定標誌時非常有用。例如,在 sub eax, ebx
之後,現在持有無符號值,我們有:
無損檢測
sub
和 and
指令修改其目標運算元,並且需要兩個額外的副本(儲存和恢復)以保持目標不被修改。
要執行非破壞性測試,請參閱 cmp
和 test
的說明。它們與破壞性對應物相同,但操作結果被丟棄,只儲存標誌。
有害 | 非破壞性的 |
---|---|
sub |
cmp |
and |
test |
test eax, eax ;and eax, eax
;ZF = 1 iff EAX is zero
test eax, 03h ;and eax, 03h
;ZF = 1 if both bit[1:0] are clear
;ZF = 0 if at least one of bit[1:0] is set
cmp eax, 241d ;sub eax, 241d
;ZF = 1 iff EAX is 241
;CF = 1 iff EAX < 241
簽名和未簽名的測試
CPU 沒有給出註冊值 1 的 特殊含義,sign 是程式設計師構造。**測試有符號和無符號值時沒有區別。**如果運算元被認為是有符號和無符號的,則處理器計算足夠的標誌來測試通常的算術關係(等於,小於,大於等)。
1 雖然它有一些只對特定格式有意義的指令,比如兩個補碼。這是為了使程式碼更有效,因為在軟體中實現演算法需要大量程式碼。