x86 指令集包含大量的條件跳轉指令。它們能比較有符號和無符號整數,並根據單個 cpu 標誌位的值來執行操作。條件跳轉指令可以分為四個型別:
基於特定標誌位的值跳轉
基於兩數是否相等,或是否等於(e)cx 的值跳轉
基於無符號運算元的比較跳轉
基於有符號運算元的比較跳轉
下表展示了基於零標誌位、進製標誌位、溢位標誌位、奇偶標誌位和符號標誌位的跳轉。
助記符 說明 標誌位/暫存器 助記符 說明 標誌位/暫存器
jz 為零跳轉 zf=1 jno 無溢位跳轉 of=0
jnz 非零跳轉 zf=0 js 有符號跳轉 sf=1
jc 進製跳轉 cf=1 jns 無符號跳轉 sf=0
jnc 無進製跳轉 cf=0 jp 偶校驗跳轉 pf=1
jo 溢位跳轉 of=1 jnp 奇校驗跳轉 pf=0
相等性的比較
下表列出了基於相等性評估的跳轉指令。有些情況下,進行比較的是兩個運算元;其他情況下,則是基於 cx、ecx 或 rcx 的值進行跳轉。表中符號 leftop 和 rightop 分別指的是 cmp 指令中的左(目的)運算元和右(源)操 作數:
助記符 說明
je 相等跳轉 (leftop=rightop)
jne 不相等跳轉 (leftop m rightop)
jcxz cx=0 跳轉
jecxz ecx=0 跳轉
jrcxz rcx=0 跳轉(64 位模式)
cmp leftop,rightop
運算元名字反映了代數中關係運算子的運算元順序。比如,表示式 x< y 中,x 被稱為 leftop,y 被稱為 rightop。
儘管 je 指令相當於 jz(為零跳轉),jne 指令相當於 jnz(非零跳轉),但是,最好是選擇最能表明程式設計意圖的助記符(je 或 jz),以便說明是比較兩個運算元還是檢查特定的狀態標誌位。
下述示例使用了 je、jne、jcxz 和 jecxz 指令。仔細閱讀注釋,以保證理解為什麼條件跳轉得以實現(或不實現)。
示例 1:
mov edx, 0a523h
cmp edx, 0a523h
jne l5 ;不發生跳轉
je l1 ;跳轉
示例 2:
mov bx,1234h
sub bx,1234h
jne l5 ;不發生跳轉
je l1 ;跳轉
示例 3:
mov ex, 0ffffh
inc ex
jexz l2 ;跳轉
示例4:
xor ecx,ecx
jeexz l2 ;跳轉
2) 無符號數比較
基於無符號數比較的跳轉如下表所示。運算元的名稱反映了表示式中運算元的順序(比如 leftop < rightop)。下表中的跳轉僅在比較無符號數值時才有意義。有符號運算元使用不同的跳轉指令。
助記符 說明 助記符 說明
ja 大於跳轉(若 leftop > rightop) jb 小於跳轉(若 leftop < rightop)
jnbe 不小於或等於跳轉(與 ja 相同) jnae 不大於或等於跳轉(與 jb 相同)
jae 大於或等於跳轉(若 leftop ≥ rightop) jbe 小於或等於跳轉(若 leftop ≤ rightop)
jnb 不小於跳轉(與 jae 相同) jna 不大於跳轉(與 jbe 相同)
3) 有符號數比較
下表列岀了基於有符號數比較的跳轉。下面的指令序列展示了兩個有符號數值的比較:
助記符 說明 助記符 說明
jg 大於跳轉(若 leftop > rightop) jl 小於跳轉(若 leftop < rightop)
jnle 不小於或等於跳轉(與 jg 相同) jnge 不大於或等於跳轉(與 jl 相同)
jge 大於或等於跳轉(若 leftop ≥ rightop) jle 小於或等於跳轉(若 leftop ≤ rightop)
jnl 不小於跳轉(與 jge 相同) jng 不大於跳轉(與 jle 相同)
mov al, +127 ;十六進製制數值 7fh
cmp al, -128 ;十六進製制數值 80h
ja is above ;不跳轉,因為 7fh < 80h
jg isgreater ;跳轉,因為 +127 > -128
由於無符號數 7fh 小於無符號數 80h,因此,為無符號數比較而設計的 ja 指令不發生跳轉。另一方面,由於 +127 大於 -128,因此,為有符號數比較而設計的 jg 指令發生跳轉。
示例 1:
mov edx,-1
cmp edx, 0
jnl l5 ;不發生跳轉(-1 ≥ 0 為假)
jnle l5 ;不發生跳轉(-1 > 0 為假)
jl l1 ;跳轉(-1 < 0 為真)
示例 2:
mov bx,+ 32
cmp bx,-35
jng l5 ;不發生跳轉( + 32 ≤ -35 為假)
jnge l5 ;不發生跳轉( + 32 < -35 為假)
jge l1 ;跳轉( + 32 ≥ -35 為真)
示例 3:
mov ecx, 0
cmp ecx, 0
jg l5 ;不發生跳轉(0 > 0 為假)
jnl l1 ;跳轉(0 ≥ 0 為真)
示例 4:
mov ecx, 0
cmp ecx, 0
jl l5 ;不發生跳轉(0 < 0 為假)
jng l1 ;跳轉(0 ≤ 0 為真)
組合語言條件跳轉指令詳解
指令 解釋jz 如果zf 1,跳轉至指定位置 jnz如果zf 0,跳轉至制定位置 je與jz類似,但通常在一條cmp指令後使用。如果源運算元與目的運算元相等,則跳轉 jne與jnz類似,但通常在一條cmp指令後使用。如果源運算元與目的運算元不相等,則跳轉 jgcmp指令做有符號比較之後,如果目的運算...
組合語言 比較指令 跳轉指令 JCC
一 jmp 指令 修改eip 當前執行的下一條指令 jmp暫存器 立即數 目標類似 mov eip,暫存器 立即數 call指令 呼叫函式 call 位址a 暫存器 等價 push位址b 儲存call的下一條指令位址,壓棧,作為返回值,mov eip,位址a 暫存器 將函式首位址作為eip ret指...
組合語言轉移指令規則彙總
摘要 雖然jmp指令提供了控制轉移,但是它不允許進行任何複雜的判斷。80x86條件跳轉指令提供了這種判斷。條件跳轉指令是建立迴圈和實現其他條件執行語句,如if endif的基本要素。條件跳轉指令檢查乙個或多個標誌位,判斷它們是否匹配某個特殊條件 就像setcc指令 如果標誌匹配成功,該指令就將控制轉...