摘要:雖然jmp指令提供了控制轉移,但是它不允許進行任何復雜的判斷。80x86條件跳轉指令提供了這種判斷。條件跳轉指令是創建循環和實現其他條件執行語句,如if…endif的基本要素。
條件跳轉指令檢查一個或多個標志位,判斷它們是否匹配某個特殊條件(就像setcc指令):如果標志匹配成功,該指令就將控制轉移到目標位置;如果匹配失敗,CPU忽略該條件跳轉指令而繼續執行下一條指令
。一些條件跳轉指令只是簡單測試符號位(sign)、進位位(carry)、溢出位(overflow)、零標志(zero)位的設置。例如,在執行一條sh1指令后,您需要測試進位標志,來判斷sh1是否從操作數的高地址位移出一位。類似地,也可以在一條test指令后測試零標志位,來判斷指定的位是否為1。大多數情況,在cmp指令之后執行條件跳轉指令。cmp指令設置標志位,以便判斷小於、大於、等於等情況。
測試標志位的JCC指令
|
指 令
|
描 述
|
條 件
|
別 名
|
相 反 指 令
|
|
JC
|
如果進位位被置位則跳轉
|
進位標志=1
|
JB,JNAE
|
JNC
|
|
JNC
|
如果進位位沒有置位則跳轉
|
進位標志=0
|
JNB,JAE
|
JC
|
|
JZ
|
如果0標志被置位則跳轉
|
0標志=1
|
JE
|
JNZ
|
|
JNZ
|
如果0標志沒有置位則跳轉
|
0標志=0
|
JNE
|
JZ
|
(續表)
|
指 令
|
描 述
|
條 件
|
別 名
|
相反指令
|
|
JS
|
如果符號位被置位則跳轉
|
符號標志=1
|
JNS
|
|
|
JNS
|
如果符號位沒有被置位則跳轉
|
符號標志=0
|
JS
|
|
|
JO
|
如果溢出標志置位則跳轉
|
溢出標志=1
|
JNO
|
|
|
JNO
|
如果溢出標志沒有置位則跳轉
|
溢出標志=0
|
JO
|
|
|
JP
|
如果奇偶校驗位被置位則跳轉
|
奇偶校驗標志=1
|
JPE
|
JNP
|
|
JPE
|
如果奇偶校驗位為偶校驗則跳轉
|
奇偶校驗標志=1
|
JP
|
JPO
|
|
JNP
|
如果奇偶校驗位沒有被置位則跳轉
|
奇偶校驗標志=0
|
JPO
|
JP
|
|
JPO
|
如果奇偶校驗位為奇校驗則跳轉
|
奇偶校驗標志=0
|
JNP
|
JPE
|
使用無符號數比較的JCC指令
|
指 令
|
描 述
|
條 件
|
別 名
|
相反指令
|
|
JA
|
如果超過(>)則跳轉
|
進位標志=0,0標志=0
|
JNBE
|
JNA
|
|
JNBE
|
如果不低於或等於(不 <=)則跳轉
|
進位標志=0,0標志=0
|
JA
|
JBE
|
|
JAE
|
如果超過或等於(>=)則跳轉
|
進位標志=0
|
JNC,JNB
|
JNAE
|
|
JNB
|
如果不低於則跳轉(不 <)
|
進位標志=0
|
JNC,JAE
|
JB
|
|
JB
|
如果低於(<)則跳轉
|
進位標志=1
|
JC,JNAE
|
JNB
|
|
JNAE
|
如果不超過或等於(不>=)則跳轉
|
進位標志=1
|
JC,JB
|
JAE
|
|
JBE
|
如果低於或等於(<=)則跳轉
|
進位標志=1或0標志=1
|
JNA
|
JNBE
|
|
JNA
|
如果不超過(不>)則跳轉
|
進位標志=1或0標志=1
|
JBE
|
JA
|
|
JE
|
如果相等(=)則跳轉
|
0標志=1
|
JZ
|
JNE
|
|
JNE
|
如果不相等(<>)則跳轉
|
0標志=0
|
JNZ
|
JE
|
使用有符號數比較的JCC指令
|
指 令
|
描 述
|
條 件
|
別 名
|
相反指令
|
|
JG
|
如果大於(>)則跳轉
|
符號標志=溢出標志或0標志=0
|
JNLE
|
JNG
|
|
JNLE
|
如果小於或等於(<=)則跳轉
|
符號標志=溢出標志或0標志=0
|
JG
|
JLE
|
|
JGE
|
如果大於或等於(>=)則跳轉
|
符號標志=溢出標志
|
JNL
|
JGE
|
|
JNL
|
如果不小於(不<)則跳轉
|
符號標志=溢出標志
|
JGE
|
JL
|
|
JL
|
如果小於(<)則跳轉
|
符號標志<>溢出標志
|
JNGE
|
JNL
|
|
JNGE
|
如果大於或等於(>=)跳轉
|
符號標志<>溢出標志
|
JL
|
JGE
|
|
JLE
|
如果小於或等於(<=)跳轉
|
符號標志<>溢出標志或0標志=1
|
JNG
|
JNLE
|
|
JNG
|
如果不大於(不>)則跳轉
|
符號標志<>溢出標志或0標志=1
|
JLE
|
JG
|
|
JE
|
如果等於(=)則跳轉
|
0標志=1
|
JZ
|
JNE
|
|
JNE
|
如果不等於(<>)則跳轉
|
0標志=0
|
JNZ
|
JE
|
loop跳轉指令:
注意這下面三行代碼:
- MOV CX,3
- NEXT: MOVSB
- LOOP NEXT
其中,loop的跳轉機制:通過對cx進行自動遞減來實現跳轉
參考:http://blog.csdn.net/trochiluses/article/details/19355425
Delphi匯編跳轉
參考:http://www.cnblogs.com/huangjacky/archive/2010/01/20/1652495.html
