1. 程式人生 > >彙編跳轉指令總結

彙編跳轉指令總結

 雖然jmp指令提供了控制轉移,但是它不允許進行任何複雜的判斷。80x86條件跳轉指令提供了這種判斷。條件跳轉指令是建立迴圈和實現其他條件執行語句條件跳轉指令檢查一個或多個標誌位,判斷它們是否匹配某個特殊條件(就像setcc指令):如果標誌匹配成功,該指令就將控制轉移到目標位置;如果匹配失敗,CPU忽略該條件跳轉指令而繼續執行下一條指令。條件跳轉指令有一個限制:目標標號的位置必須在跳轉指令本身附近32768位元組範圍內,這通常對應著800032000條機器指令。一般情況下不會超過這種限制。

用自己的話總結:條件跳轉指令是指jz,jg..等等指令,這些指令跳轉方式是根據標誌位的狀態進行跳轉,而設定這些標誌的常見指令為

cmptest指令,所以他們經常搭配使用(應該是必須的)。即跳轉指令前一行要嗎有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