組合語言條件跳轉指令彙總

2021-10-03 00:25:27 字數 2755 閱讀 8444

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指令 如果標誌匹配成功,該指令就將控制轉...