彙編基礎(4) 程式控制轉移

來源:互聯網
上載者:User

 

程式控制轉移

 

 

對於編程來說控製程序走向是非常重要的事情,它是你的程式根據條件

 

作出判斷,跳轉到相應的位值。 無條件跳轉

控製程序轉向的最基本的指令是jJMP.

使用形式如下:
JMP label
在程式中聲明/label/的方法很簡單,只要在它名字後面加上“:”,
label可以由任何字元混合而成但是不能由數字開頭,例如,下面
是3個合法的label
label1:
label2:
a:
label可以在一條指令的前面聲明,例如:
x1:
MOV AX, 1

x2: MOV AX, 2
下面是一個 JMP 指令的例子:

ORG 100h

MOV AX, 5 ; 將 AX 設定為 5.
MOV BX, 2 ; 將 BX 設定為 2.

JMP calc ; 跳轉到 'calc'.

back: JMP stop ; 跳轉到 'stop'.

calc:
ADD AX, BX ; 將 BX 加到 AX.
JMP back ; 返回 'back'.

stop:

RET ; 返回作業系統

END

當然有更簡單的計算這兩個數字之和的方法,但是

 

上面是一個JMP指令的很好的例子。

從例子中可以看出,JMP可以控制向前和向後。它可以

 

轉移到當前程式碼片段的任意位置(65535位元組)。

 

短條件轉移

 

 

與JMP這一無條件轉移指令不同,還有一些有條件跳轉

 

指令(只有在條件成立的時侯才跳轉)。這些指令分為

 

三組,第一組是只檢測單獨標記位,第二組比較有符

 

號數,第三組比較無符號數。

 

檢測單獨標記位的轉移指令

 

指令

說明

條件

相反指令

JZ , JE

如果為0(相等),轉移 .

ZF =1

JNZ, JNE

JC , JB, JNAE

如果進位 (小於, 不大於等於),轉移

 CF = 1

JNC, JNB, JAE

JS

如果是負數,轉移

 SF = 1

JNS

JO

如果溢出,轉移

 OF = 1

JNO

JPE, JP

如果是偶數,轉移

 PF = 1

JPO

JNZ , JNE

如果不為0(不相等),轉移

 ZF = 0

JZ, JE

JNC , JNB, JAE

如果沒有進位(大於, 大於等於),轉移

 CF = 0

JC, JB, JNAE

JNS

如果不是負數,轉移

 SF = 0

JS

JNO

如果沒有溢出,轉移

 OF = 0

JO

JPO, JNP

如果不是偶數,轉移

 PF = 0

JPE, JP

 

可以看到一些指令功能相同,對,他們編譯之後產生

 

相同機器碼所以很容易理解為什麼你編譯 JE 指令

 

而反編譯得到的卻是JZ.使用不同的名稱是為了使程式更容易理解。

 

比較有符號數的轉移指令

 

 

指令

說明

條件

相反指令

JE , JZ

如果等於 (=),如果為0,跳轉

ZF = 1

JNE, JNZ

JNE , JNZ

如果不等於 (<>),如果不等於0,跳轉

ZF = 0

JE, JZ

JG , JNLE

如果大於 (>) 如果不小於等於 (not <=),跳轉

ZF = 0

和

SF = OF

JNG, JLE

JL , JNGE

如果小與Jump if Less (<) 如果不大於等於 (not >=),跳轉

SF <> OF

JNL, JGE

JGE , JNL

如果大於等於 (>=),如果不小於 (not <),跳轉

SF = OF

JNGE, JL

JLE , JNG

如果小於等於 (<=),如果不大於 (not >),跳轉

ZF = 1

或者

SF <> OF

JNLE, JG

 

<> - 符號表示不等於.

 

 

比較無符號數轉移指令

 

 

指令

說明

條件

相反指令

JE , JZ

如果等於 (=).,如果為0,跳轉

ZF = 1

JNE, JNZ

JNE , JNZ

如果不等於(<>),如果不為0,跳轉

ZF = 0

JE, JZ

JA , JNBE

如果大於 (>),如果不小於等於(not <=),跳轉

CF = 0

and

ZF = 0

JNA, JBE

JB , JNAE, JC

如果小於 (<),如果不大於等於(not >=),如果進位,跳轉

CF = 1

JNB, JAE, JNC

JAE , JNB, JNC

如果大於等於(>=),如果不小於 (not <),如果沒有進位,跳轉

CF = 0

JNAE, JB

JBE , JNA

如果小於或者等於(<=),如果不大於 (not >),跳轉

CF = 1

or

ZF = 1

JNBE, JA

一般來說,需要使用CMP指令來比較數值(該指令與 SUB(減法)

指令相近,只不過不儲存結果,而只修改標值位)

 

上面說法的意思是,例如:

 

需要比較5 和2, 5-2 =3

 

結果不是0(0標值位設定為 0)

 

另一個例子

 

比較 7和7

 

7 - 7 = 0

 

結果為0。 (0標值位設定為1。 JZ 或者 JE 會轉移).

 

下面是一個 CMP 指令和條件轉移指令的例子:

 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.