汇编跳转指令总结
?雖然jmp指令提供了控制轉移,但是它不允許進行任何復雜的判斷。80x86條件跳轉指令提供了這種判斷。條件跳轉指令是創建循環和實現其他條件執行語句。條件跳轉指令檢查一個或多個標志位,判斷它們是否匹配某個特殊條件(就像setcc指令):如果標志匹配成功,該指令就將控制轉移到目標位置;如果匹配失敗,CPU忽略該條件跳轉指令而繼續執行下一條指令。條件跳轉指令有一個限制:目標標號的位置必須在跳轉指令本身附近32768字節范圍內,這通常對應著8000~32000條機器指令。一般情況下不會超過這種限制。
用自己的話總結:條件跳轉指令是指jz,jg..等等指令,這些指令跳轉方式是根據標志位的狀態進行跳轉,而設置這些標志的常見指令為cmp和test指令,所以他們經常搭配使用(應該是必須的)。即跳轉指令前一行要嗎有cmp指令要嗎有test指令。
匯編標志位:
標志名??????????????????????????標志?1??????????????標志?0
OF?(溢出標志)?????????????????OV??????????????????NV
DF??(方向標志) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UP??????????????????DN
IF?(中斷標志)?????????????????DI??????????????????EI
SF?(符號標志位)???????????????PL??????????????????NG
ZF?(零標志)???????????????????NZ??????????????????ZR
AF?(輔助進位標志位)???????????NA??????????????????AC
PF?(奇偶標志)?????????????????PO??????????????????PE
CF?(進位標志)?????????????????NC??????????????????CY
反匯編窗口,對應的標志位(雙擊后面的數字可改變其狀態)
Test和cmp指令的區別
test屬于邏輯運算指令
Test對兩個參數(目標,源)執行AND邏輯操作,并根據結果設置標志寄存器,結果本身不會保存。
舉例:
Test的一個非常普遍的用法是用來測試一方寄存器是否為空:
test ecx, ecx
jz somewhere
如果ecx為零,設置ZF零標志為1,Jz跳轉
--------------------------------------------
CMP屬于算術運算指令
CMP比較.(兩操作數作減法,僅修改標志位,不回送結果).?
cmp實際上是只設置標志不保存結構的減法,并設置Z-flag(零標志).
舉例:
Cmp eax, 2; ? ? ? 如果eax-2=0即eax=2就設置零標志為1
Jz ****; ? ? ? ? ?如果設置了零標志就跳轉
============================================
得出的結論
test邏輯與運算結果為零,就把ZF(零標志)置1;
cmp 算術減法運算結果為零,就把ZF(零標志)置1.
| 指?令 | 描?述 | 條?件 | 別?名 | 相?反?指?令 |
| 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 |
總結
- 上一篇: OD快捷键例子
- 下一篇: 反汇编最基础知识(段寄存器和寄存器的说明