程式控制轉移
對於編程來說控製程序走向是非常重要的事情,它是你的程式根據條件
作出判斷,跳轉到相應的位值。 無條件跳轉
控製程序轉向的最基本的指令是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 指令和條件轉移指令的例子: