匯編跳轉(zhuǎn)指令使用總結(jié)
雖然jmp指令提供了控制轉(zhuǎn)移,但是它不允許進行任何復雜的判斷。80x86條件跳轉(zhuǎn)指令提供了這種判斷。條件跳轉(zhuǎn)指令是創(chuàng)建循環(huán)和實現(xiàn)其他條件執(zhí)行語句。條件跳轉(zhuǎn)指令檢查一個或多個標志位,判斷它們是否匹配某個特殊條件(就像setcc指令):如果標志匹配成功,該指令就將控制轉(zhuǎn)移到目標位置;如果匹配失敗,CPU忽略該條件跳轉(zhuǎn)指令而繼續(xù)執(zhí)行下一條指令。條件跳轉(zhuǎn)指令有一個限制:目標標號的位置必須在跳轉(zhuǎn)指令本身附近32768字節(jié)范圍內(nèi),這通常對應著8000~32000條機器指令。一般情況下不會超過這種限制。
用自己的話總結(jié):條件跳轉(zhuǎn)指令是指jz,jg..等等指令,這些指令跳轉(zhuǎn)方式是根據(jù)標志位的狀態(tài)進行跳轉(zhuǎn),而設置這些標志的常見指令為cmp和test指令,所以他們經(jīng)常搭配使用(應該是必須的)。即跳轉(zhuǎn)指令前一行要嗎有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
反匯編窗口,對應的標志位(雙擊后面的數(shù)字可改變其狀態(tài))

Test和cmp指令的區(qū)別
test屬于邏輯運算指令
Test對兩個參數(shù)(目標,源)執(zhí)行AND邏輯操作,并根據(jù)結(jié)果設置標志寄存器,結(jié)果本身不會保存。
舉例:
Test的一個非常普遍的用法是用來測試一方寄存器是否為空:
test ecx, ecx
jz somewhere
如果ecx為零,設置ZF零標志為1,Jz跳轉(zhuǎn)
--------------------------------------------
CMP屬于算術運算指令
CMP比較.(兩操作數(shù)作減法,僅修改標志位,不回送結(jié)果).
cmp實際上是只設置標志不保存結(jié)構的減法,并設置Z-flag(零標志).
舉例:
Cmp eax, 2; 如果eax-2=0即eax=2就設置零標志為1
Jz ****; 如果設置了零標志就跳轉(zhuǎn)
============================================
得出的結(jié)論
test邏輯與運算結(jié)果為零,就把ZF(零標志)置1;
cmp 算術減法運算結(jié)果為零,就把ZF(零標志)置1.
|
指 令 |
描 述 |
條 件 |
別 名 |
相 反 指 令 |
|
JC |
如果進位位被置位則跳轉(zhuǎn) |
進位標志=1 |
JB,JNAE |
JNC |
|
JNC |
如果進位位沒有置位則跳轉(zhuǎn) |
進位標志=0 |
JNB,JAE |
JC |
|
JZ |
如果0標志被置位則跳轉(zhuǎn) |
0標志=1 |
JE |
JNZ |
|
JNZ |
如果0標志沒有置位則跳轉(zhuǎn) |
0標志=0 |
JNE |
JZ |
|
指 令 |
描 述 |
條 件 |
別 名 |
相反指令 |
|
JS |
如果符號位被置位則跳轉(zhuǎn) |
符號標志=1 |
JNS |
|
|
JNS |
如果符號位沒有被置位則跳轉(zhuǎn) |
符號標志=0 |
JS |
|
|
JO |
如果溢出標志置位則跳轉(zhuǎn) |
溢出標志=1 |
JNO |
|
|
JNO |
如果溢出標志沒有置位則跳轉(zhuǎn) |
溢出標志=0 |
JO |
|
|
JP |
如果奇偶校驗位被置位則跳轉(zhuǎn) |
奇偶校驗標志=1 |
JPE |
JNP |
|
JPE |
如果奇偶校驗位為偶校驗則跳轉(zhuǎn) |
奇偶校驗標志=1 |
JP |
JPO |
|
JNP |
如果奇偶校驗位沒有被置位則跳轉(zhuǎn) |
奇偶校驗標志=0 |
JPO |
JP |
|
JPO |
如果奇偶校驗位為奇校驗則跳轉(zhuǎn) |
奇偶校驗標志=0 |
JNP |
JPE |
使用無符號數(shù)比較的JCC指令
|
指 令 |
描 述 |
條 件 |
別 名 |
相反指令 |
|
JA |
如果超過(>)則跳轉(zhuǎn) |
進位標志=0,0標志=0 |
JNBE |
JNA |
|
JNBE |
如果不低于或等于(不 <=)則跳轉(zhuǎn) |
進位標志=0,0標志=0 |
JA |
JBE |
|
JAE |
如果超過或等于(>=)則跳轉(zhuǎn) |
進位標志=0 |
JNC,JNB |
JNAE |
|
JNB |
如果不低于則跳轉(zhuǎn)(不 <) |
進位標志=0 |
JNC,JAE |
JB |
|
JB |
如果低于(<)則跳轉(zhuǎn) |
進位標志=1 |
JC,JNAE |
JNB |
|
JNAE |
如果不超過或等于(不>=)則跳轉(zhuǎn) |
進位標志=1 |
JC,JB |
JAE |
|
JBE |
如果低于或等于(<=)則跳轉(zhuǎn) |
進位標志=1或0標志=1 |
JNA |
JNBE |
|
JNA |
如果不超過(不>)則跳轉(zhuǎn) |
進位標志=1或0標志=1 |
JBE |
JA |
|
JE |
如果相等(=)則跳轉(zhuǎn) |
0標志=1 |
JZ |
JNE |
|
JNE |
如果不相等(<>)則跳轉(zhuǎn) |
0標志=0 |
JNZ |
JE |
使用有符號數(shù)比較的JCC指令
|
指 令 |
描 述 |
條 件 |
別 名 |
相反指令 |
|
JG |
如果大于(>)則跳轉(zhuǎn) |
符號標志=溢出標志或0標志=0 |
JNLE |
JNG |
|
JNLE |
如果小于或等于(<=)則跳轉(zhuǎn) |
符號標志=溢出標志或0標志=0 |
JG |
JLE |
|
JGE |
如果大于或等于(>=)則跳轉(zhuǎn) |
符號標志=溢出標志 |
JNL |
JGE |
|
JNL |
如果不小于(不<)則跳轉(zhuǎn) |
符號標志=溢出標志 |
JGE |
JL |
|
JL |
如果小于(<)則跳轉(zhuǎn) |
符號標志<>溢出標志 |
JNGE |
JNL |
|
JNGE |
如果大于或等于(>=)跳轉(zhuǎn) |
符號標志<>溢出標志 |
JL |
JGE |
|
JLE |
如果小于或等于(<=)跳轉(zhuǎn) |
符號標志<>溢出標志或0標志=1 |
JNG |
JNLE |
|
JNG |
如果不大于(不>)則跳轉(zhuǎn) |
符號標志<>溢出標志或0標志=1 |
JLE |
JG |
|
JE |
如果等于(=)則跳轉(zhuǎn) |
0標志=1 |
JZ |
JNE |
|
JNE |
如果不等于(<>)則跳轉(zhuǎn) |
0標志=0 |
JNZ |
JE |
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
匯編語言XOR指令:對兩個操作數(shù)進行邏輯(按位)異或操作(推薦)
匯編語言(assembly language)是一種用于電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。這篇文章主要介紹了匯編語言XOR指令:對兩個操作數(shù)進行邏輯(按位)異或操作,需要的朋友可以參考下2020-01-01

