汇编跳转指令总结
?雖然jmp指令提供了控制轉(zhuǎn)移,但是它不允許進(jìn)行任何復(fù)雜的判斷。80x86條件跳轉(zhuǎn)指令提供了這種判斷。條件跳轉(zhuǎn)指令是創(chuàng)建循環(huán)和實現(xiàn)其他條件執(zhí)行語句。條件跳轉(zhuǎn)指令檢查一個或多個標(biāo)志位,判斷它們是否匹配某個特殊條件(就像setcc指令):如果標(biāo)志匹配成功,該指令就將控制轉(zhuǎn)移到目標(biāo)位置;如果匹配失敗,CPU忽略該條件跳轉(zhuǎn)指令而繼續(xù)執(zhí)行下一條指令。條件跳轉(zhuǎn)指令有一個限制:目標(biāo)標(biāo)號的位置必須在跳轉(zhuǎn)指令本身附近32768字節(jié)范圍內(nèi),這通常對應(yīng)著8000~32000條機(jī)器指令。一般情況下不會超過這種限制。
用自己的話總結(jié):條件跳轉(zhuǎn)指令是指jz,jg..等等指令,這些指令跳轉(zhuǎn)方式是根據(jù)標(biāo)志位的狀態(tài)進(jìn)行跳轉(zhuǎn),而設(shè)置這些標(biāo)志的常見指令為cmp和test指令,所以他們經(jīng)常搭配使用(應(yīng)該是必須的)。即跳轉(zhuǎn)指令前一行要嗎有cmp指令要嗎有test指令。
匯編標(biāo)志位:
標(biāo)志名??????????????????????????標(biāo)志?1??????????????標(biāo)志?0
OF?(溢出標(biāo)志)?????????????????OV??????????????????NV
DF??(方向標(biāo)志) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UP??????????????????DN
IF?(中斷標(biāo)志)?????????????????DI??????????????????EI
SF?(符號標(biāo)志位)???????????????PL??????????????????NG
ZF?(零標(biāo)志)???????????????????NZ??????????????????ZR
AF?(輔助進(jìn)位標(biāo)志位)???????????NA??????????????????AC
PF?(奇偶標(biāo)志)?????????????????PO??????????????????PE
CF?(進(jìn)位標(biāo)志)?????????????????NC??????????????????CY
反匯編窗口,對應(yīng)的標(biāo)志位(雙擊后面的數(shù)字可改變其狀態(tài))
Test和cmp指令的區(qū)別
test屬于邏輯運(yùn)算指令
Test對兩個參數(shù)(目標(biāo),源)執(zhí)行AND邏輯操作,并根據(jù)結(jié)果設(shè)置標(biāo)志寄存器,結(jié)果本身不會保存。
舉例:
Test的一個非常普遍的用法是用來測試一方寄存器是否為空:
test ecx, ecx
jz somewhere
如果ecx為零,設(shè)置ZF零標(biāo)志為1,Jz跳轉(zhuǎn)
--------------------------------------------
CMP屬于算術(shù)運(yùn)算指令
CMP比較.(兩操作數(shù)作減法,僅修改標(biāo)志位,不回送結(jié)果).?
cmp實際上是只設(shè)置標(biāo)志不保存結(jié)構(gòu)的減法,并設(shè)置Z-flag(零標(biāo)志).
舉例:
Cmp eax, 2; ? ? ? 如果eax-2=0即eax=2就設(shè)置零標(biāo)志為1
Jz ****; ? ? ? ? ?如果設(shè)置了零標(biāo)志就跳轉(zhuǎn)
============================================
得出的結(jié)論
test邏輯與運(yùn)算結(jié)果為零,就把ZF(零標(biāo)志)置1;
cmp 算術(shù)減法運(yùn)算結(jié)果為零,就把ZF(零標(biāo)志)置1.
| 指?令 | 描?述 | 條?件 | 別?名 | 相?反?指?令 |
| JC | 如果進(jìn)位位被置位則跳轉(zhuǎn) | 進(jìn)位標(biāo)志=1 | JB,JNAE | JNC |
| JNC | 如果進(jìn)位位沒有置位則跳轉(zhuǎn) | 進(jìn)位標(biāo)志=0 | JNB,JAE | JC |
| JZ | 如果0標(biāo)志被置位則跳轉(zhuǎn) | 0標(biāo)志=1 | JE | JNZ |
| JNZ | 如果0標(biāo)志沒有置位則跳轉(zhuǎn) | 0標(biāo)志=0 | JNE | JZ |
| 指?令 | 描?述 | 條?件 | 別?名 | 相反指令 |
| JS | 如果符號位被置位則跳轉(zhuǎn) | 符號標(biāo)志=1 | ? | JNS |
| JNS | 如果符號位沒有被置位則跳轉(zhuǎn) | 符號標(biāo)志=0 | ? | JS |
| JO | 如果溢出標(biāo)志置位則跳轉(zhuǎn) | 溢出標(biāo)志=1 | ? | JNO |
| JNO | 如果溢出標(biāo)志沒有置位則跳轉(zhuǎn) | 溢出標(biāo)志=0 | JO | ? |
| JP | 如果奇偶校驗位被置位則跳轉(zhuǎn) | 奇偶校驗標(biāo)志=1 | JPE | JNP |
| JPE | 如果奇偶校驗位為偶校驗則跳轉(zhuǎn) | 奇偶校驗標(biāo)志=1 | JP | JPO |
| JNP | 如果奇偶校驗位沒有被置位則跳轉(zhuǎn) | 奇偶校驗標(biāo)志=0 | JPO | JP |
| JPO | 如果奇偶校驗位為奇校驗則跳轉(zhuǎn) | 奇偶校驗標(biāo)志=0 | JNP | JPE |
使用無符號數(shù)比較的JCC指令
| 指?令 | 描?述 | 條?件 | 別?名 | 相反指令 |
| JA | 如果超過(>)則跳轉(zhuǎn) | 進(jìn)位標(biāo)志=0,0標(biāo)志=0 | JNBE | JNA |
| JNBE | 如果不低于或等于(不?<=)則跳轉(zhuǎn) | 進(jìn)位標(biāo)志=0,0標(biāo)志=0 | JA | JBE |
| JAE | 如果超過或等于(>=)則跳轉(zhuǎn) | 進(jìn)位標(biāo)志=0 | JNC,JNB | JNAE |
| JNB | 如果不低于則跳轉(zhuǎn)(不?<) | 進(jìn)位標(biāo)志=0 | JNC,JAE | JB |
| JB | 如果低于(<)則跳轉(zhuǎn) | 進(jìn)位標(biāo)志=1 | JC,JNAE | JNB |
| JNAE | 如果不超過或等于(不>=)則跳轉(zhuǎn) | 進(jìn)位標(biāo)志=1 | JC,JB | JAE |
| JBE | 如果低于或等于(<=)則跳轉(zhuǎn) | 進(jìn)位標(biāo)志=1或0標(biāo)志=1 | JNA | JNBE |
| JNA | 如果不超過(不>)則跳轉(zhuǎn) | 進(jìn)位標(biāo)志=1或0標(biāo)志=1 | JBE | JA |
| JE | 如果相等(=)則跳轉(zhuǎn) | 0標(biāo)志=1 | JZ | JNE |
| JNE | 如果不相等(<>)則跳轉(zhuǎn) | 0標(biāo)志=0 | JNZ | JE |
使用有符號數(shù)比較的JCC指令
| 指?令 | 描?述 | 條?件 | 別?名 | 相反指令 |
| JG | 如果大于(>)則跳轉(zhuǎn) | 符號標(biāo)志=溢出標(biāo)志或0標(biāo)志=0 | JNLE | JNG |
| JNLE | 如果小于或等于(<=)則跳轉(zhuǎn) | 符號標(biāo)志=溢出標(biāo)志或0標(biāo)志=0 | JG | JLE |
| JGE | 如果大于或等于(>=)則跳轉(zhuǎn) | 符號標(biāo)志=溢出標(biāo)志 | JNL | JGE |
| JNL | 如果不小于(不<)則跳轉(zhuǎn) | 符號標(biāo)志=溢出標(biāo)志 | JGE | JL |
| JL | 如果小于(<)則跳轉(zhuǎn) | 符號標(biāo)志<>溢出標(biāo)志 | JNGE | JNL |
| JNGE | 如果大于或等于(>=)跳轉(zhuǎn) | 符號標(biāo)志<>溢出標(biāo)志 | JL | JGE |
| JLE | 如果小于或等于(<=)跳轉(zhuǎn) | 符號標(biāo)志<>溢出標(biāo)志或0標(biāo)志=1 | JNG | JNLE |
| JNG | 如果不大于(不>)則跳轉(zhuǎn) | 符號標(biāo)志<>溢出標(biāo)志或0標(biāo)志=1 | JLE | JG |
| JE | 如果等于(=)則跳轉(zhuǎn) | 0標(biāo)志=1 | JZ | JNE |
| JNE | 如果不等于(<>)則跳轉(zhuǎn) | 0標(biāo)志=0 | JNZ | JE |
總結(jié)
- 上一篇: OD快捷键例子
- 下一篇: 反汇编最基础知识(段寄存器和寄存器的说明