Intel 8086中,程序的執(zhí)行序列是由代碼段寄存器CS和指令指針I(yè)P確定的。CS包含當前指令所在代碼段的段地址,IP則是要執(zhí)行的下一條指令的偏移地址。程序的執(zhí)行一般是依指令序列順序執(zhí)行,但有時候需要改變程序的流程,實現分支程序??刂妻D移類指令通過修改CS和IP的值改變程序的執(zhí)行順序,實現分支。分支程序有時根據某個條件轉移執(zhí)行,有時無條件條轉到某條指令執(zhí)行,轉移指令的目標地址是代碼段中某個指令的位移量,這個位移量是用標號來指出的。
一、標號
標號(過程名亦視為標號)用來說明可執(zhí)行指令在匯編語言程序中的位置(從這個角度來說,變量應用于說明偽指令的位置)。標號可以作為轉移指令(或調用指令CALL)的操作數。和變量類似,標號有三種屬性:段(SEGMENT)、位移量(OFFSET)和距離(DISTANCE)。段和位移量屬性就是在哪個段、什么位置上定義的標號。標號只要有了定義,這兩個屬性就自然的產生。如果標號只能在本段中(即標號所定義的段中)用JMP或條件轉移指令(或CALL)進行訪問,那么必須將這個標號的距離屬性定義為NEAR;如果標號能為其他段中的JNMP(或CALL)指令訪問,則需將標號的距離屬性定義為FAR。標號的距離屬性需要再定義標號時指出。
1、標號的定義
(1)定義距離屬性為NEAR的標號
1)距離屬性為NEAR的標號可以用隱含的說明,即在標號名后面加上冒號,放在指令前面。如:
L1: MOV AX,BX
@: ADD AX,100
2)距離屬性為NEAR的標號也可以用現實說明,即用LABEL位指令明顯說明,或在EQU位指令中用THIS操作符明顯的指出。如:
L2 LABEL NEAR
MOV CX,5
L3 EQU THIS NEAR
AND AX,0FFH
(2)定義距離屬性為FAR的標號
距離屬性為FAR的標號只能顯示說明
L4 LABEL FAR
MOV AX,DX
L5 EQU THIS FAR
OR AL,30H
(3)同一條指令處可以定義兩個距離屬性不同的標號,以提高訪問標號的靈活性。
L6 LABEL FAR
L7: XOR AX,0F0H
其中,標號L6和L7的段屬性和位移量屬性是一樣的,而距離屬性不同,L6位FAR,7位NEAR.其他段的JMP指令轉移到此處時,用L6作為JMP指令的操作數(目標地址);而本段的JMP指令或條件轉移指令轉移到此處時,用L7作為指令操作數。
2、允許對標號進行操作的數值返回操作符
(1)SEG 標號名
返回標號所在段的基址
(2)OFFSET 標號名
返回標號所在段的位移量
(3)TYPE 標號名
返回標號的屬性NEAR或FAR
二、無條件轉移指令
所謂無條件轉移,就是無任何先決條件就能使程序改變執(zhí)行順序。處理器只要執(zhí)行無條件轉移指令JMP,就使程序轉到指定的目標地址處,從目標地址處開始執(zhí)行那里的指令。
JMP LABEL ;程序專項LABEL標號制定的地址
操作數LABEL使要轉移到目標地址,也稱為目的地址、轉移地址。LABEL操作數的尋址方法可以是直接尋址或間接尋址。JMP指令可以講程序轉移到1MB存儲空間的任何位置。根據跳轉的距離,JMP指令分成了段內轉移和段間轉移。
●段內轉移是指在單前代碼段64K范圍內轉移,因此不需要更改CS段地址,只要改變IP偏移地址。如果轉移范圍可以用一個字節(jié)(-128~+127)表達,則可以形成所謂的“短轉移 SHORT JMP”;如果地址位移用一個16位數表達,則形成“近轉移 NEAR JMP”,它是在+/-32KB范圍。
●段間轉移是指從當前代碼段跳轉到另一個代碼段,此時需要更改CS段地址和IP偏移地址。這種轉移也稱為“遠轉移 FAR JMP”;轉移的目標地址必須用一個32位數表達,叫做32位遠指針,它就是邏輯地址。
由此,JMP指令根據目標地址不同的提供方法和內容,可分成四種格式:
1、段內轉移,直接尋址
JMP LABEL ;IP←IP+位移量
其中位移量是指緊接著JMP指令后的那條指令的偏移地址,到目標地址的偏移地址的地址位移。當向地址增大的方向轉移時,位移量為正;向地址減小方向轉移時,位移量為負。匯編程序能夠根據位移量的大小自動形成短轉移或近轉移。同時,匯編程序也提供了短轉移SHORT和近轉移NEAR PTR操作符,用于強制產生相應的指令格式。
JMP SHORT LABEL
JMP NEAR PTR LABEL
2、段內轉移,間接尋址
JMP R16/M16 ;IP←R16/M16
這種形式的JMP指令,將一個16位寄存器或主存單元內容送至IP寄存器,作為新的指令指針,但不修改CS寄存器的內容。如:
JMP AX
JMP WORD PTR [2000H]
3、段間轉移,直接尋址
JMP FAR PTR LABEL ;IP←LABEL的偏移地址,CS←LABEL的段地址
段間直接轉移指令,是將標號所在段的段地址作為新的CS值,標號在該段內的偏移地址作為新的IP值;這樣程序就能跳轉到新的代碼段執(zhí)行。一個標號是在同一個段內還是在另一個段中,匯編程序能夠自動識別,如果要強制衣個段間遠轉移,則可以用匯編偽指令FAR PTR。如:
CODE1 SEGMENT ;代碼段1
......
JMP FAR PTR OTHERSEG ;遠轉移到代碼段2的OTHERSEG
......
CODE1 ENDS ;代碼段1結束
CODE2 SEGMENT
......
OTHERSEG: .....
.....
CODE2 ENDS
4、段間轉移,間接尋址
JMP FAR PTR MEM ;IP←[MEM],CS←[MEM+2]
段間間接轉移指令,用一個雙字存儲單元表示要跳轉的目標地址。這個目標地址存放在主存中連續(xù)的兩個字單元中,其中地位字送IP寄存器,高位字送CS寄存器。
MOV WORD PTR [BX],0
MOV WORD PTR [BX+2],1500H
JMP FAR PTR [BX]