彙編跳轉指令總結
雖然jmp指令提供了控制轉移,但是它不允許進行任何複雜的判斷。80x86條件跳轉指令提供了這種判斷。條件跳轉指令是建立迴圈和實現其他條件執行語句。條件跳轉指令檢查一個或多個標誌位,判斷它們是否匹配某個特殊條件(就像setcc指令):如果標誌匹配成功,該指令就將控制轉移到目標位置;如果匹配失敗,CPU忽略該條件跳轉指令而繼續執行下一條指令。條件跳轉指令有一個限制:目標標號的位置必須在跳轉指令本身附近32768位元組範圍內,這通常對應著8000~32000條機器指令。一般情況下不會超過這種限制。
用自己的話總結:條件跳轉指令是指jz,jg..等等指令,這些指令跳轉方式是根據標誌位的狀態進行跳轉,而設定這些標誌的常見指令為
彙編標誌位:
標誌名 標誌 1 標誌 0
OF (溢位標誌) OV NV
DF (方向標誌) UP DN
IF (中斷標誌) DI EI
SF (符號標誌位)
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 |