(1)無條件轉讓
JMP跳躍
(2)有條件轉讓
如果JZ/JNZ結果為零/非零,它將被轉移。
JS/JNS結果為負/正常轉換。
喬/JNO溢出/不溢出,然後轉移。
如果JP/JNP的奇偶校驗位是1/ 0,將被傳送。
如果JB/JNB低於/不低於,將被轉移。
如果JBE/JNBE低於或等於/高於,將被轉移。
如果JL/JNL小於/不小於,它將被轉移。
如果JLE/JNLE小於或等於/大於,它將被轉移。
如果JCXZ·CX是零,它就會轉移。
(3)循環指令
循環回路
當LOOPZ/LOOPE為零/相等時循環。
LOOPNZ/LOOPNE不為零/不等周期
(4)子程序調用和返回
打電話
RET返回
⑸中斷和中斷返回
INT中斷
溢出中斷。
IRET中斷返回
壹個程序中指令的執行順序是由CS:IP決定的,程序轉移指令可以改變IP或者CS和IP的內容,從而控制指令的執行順序,實現指令轉移、程序調用等功能。
1無條件分支指令
JMP指令控制程序無條件地跳轉到目標單元,使用JMP指令有三種格式:
jump短標短跳。
(2) JMP靠近ptr標簽附近跳躍。
● JMP標簽直接跳轉。
● JMP註冊寄存器間接跳轉。
● JMP字PTR OPR存儲器間接跳轉。
(3) JMP遠ptr標簽遠跳轉。
短分支的目標地址(或轉向地址)相對於當前IP值的位移在-128到+127字節之間,是指JMP指令的下壹條指令的地址(如圖3.11)。對於短分支JMP,機器指令的第壹個字節是操作碼EB,第二個字節是位移00~FF,是有符號補數。轉向地址的計算方法是:(IP)當前+8位位移。操作符SHORT指示匯編程序將JMP指令匯編成壹條2字節的指令。
jump短標短跳。
操作:(IP) ← (IP)電流+8位位移
短轉移圖
(2) JMP靠近ptr標簽附近跳躍。
近傳是JMP指令的默認格式,可以寫成“JMP標簽”。它可以在當前代碼段中傳輸。機器指令的操作碼是E9,位移是16有符號補數。指令中的引導地址可以是直接尋址、寄存器尋址、寄存器間接尋址和存儲器尋址。
● JMP標簽直接跳轉。
運算:(IP) ←偏移標簽= (IP)當前+16位位移。
分支的目標地址可以直接使用指令中的符號地址。因為位移是16位,所以它的分支範圍應該是-32768到+32767,即近分支指令可以轉移到段中的任意位置。
● JMP註冊寄存器間接跳轉。
操作:(IP) ← (reg)
傳送的目標地址在寄存器中,例如指令“JMP·BX”的執行結果,BX的內容被發送到IP。
● JMP字PTR OPR存儲器間接跳轉。
操作:(IP) ← (PA+1,PA)
存儲器的物理地址PA由指令中的尋址模式決定。由於JMP指令的執行,PA單元的字內容被發送到IP寄存器。比如“JMP字PTR [DI]”,物理地址PA = (DS) × 24+(di),指令執行的結果是(IP)= (PA+1,PA)。
(3) JMP遠ptr標簽遠跳轉。
操作:(IP) ←標簽的段內偏移地址
(cs) ←標簽所在段的段地址。
遠分支實現了段間跳轉,即從當前代碼段跳轉到另壹個代碼段,這意味著指令執行後,不僅IP的值會改變,CS也會得到壹個新的段地址。在匯編指令中,遠分支的目的地址也可以用除立即尋址方式以外的任何尋址方式表示。
2條件跳轉指令(conditional jump)
條件分支指令是壹種只有在滿足指定條件後才控制程序轉移的指令。表3.4總結了8086的條件分支指令。
所有條件分支指令都是短分支指令,分支的目標地址必須在當前IP地址的-128到+127字節範圍內,所以條件分支指令是2字節指令。
計算轉向地址的方法與無條件短分支指令相同,參見例3.40的反匯編代碼。
例3.40程序中的“JNZ AGAIN”組裝成“JNZ 000D”,其中000D是再次標簽的地址,指令“JNZ 000D”的機器碼是75FA,75是操作碼,FA是位移。CPU讀取JNZ指令時,IP寄存器自動加2(JNZ的指令長度)指向下壹條指令(MOV),IP當前值為0013。計算轉向地址時,(IP)current+offset = 0013+FA = 0013+FFFA = 000d,這也是的偏移地址。其實FA是-6的補碼。8位FA加16位0013時,FA的符號擴展到FFFA,相加的結果是000D。
表3.4有條件轉移指令的分類:轉移指令
(I)如果JZ/jezf = 1為零/相等,則轉移。
JNZ/JNEZF = 0不為零/相等,則轉移。
JSSF = 1為負,則轉移。
如果jnssf = 0為正,則轉移。
Jo of = 1溢出,然後轉移。
Jnoof = 0不溢出,那麽它被轉移。
JpF = 1如果奇偶校驗位為1,則進行傳輸。
JNPP PF = 0。如果奇偶校驗位為0,它將被傳輸。
Jccf = 1。如果二進制位是1,則轉移分支。
JNCCCF = 0如果進位位為0,它將被傳輸。
(二)JB/JNAE/JCCF = 1低於/不高於或等於,則轉移。
JNB/JAE/JNCCCF = 0不低於/高於或等於,則轉移。
如果jbe/jna (cfzf) = 1低於或等於/不高於,則轉移。
JNBE/JA (CFZF) = 0不小於等於/大於,則轉移。
(iii) JL/JNGE (SF of) = 1小於/不大於或等於,則轉移。
如果jnl/jge (sfof) = 0不小於/大於等於0,則轉移。
Jle/JNG ((SF of) ZF) = 1小於等於/不大於,則轉移。
Jnle/jg ((SF of) ZF) = 0不小於或等於/大於,則轉移。
(ⅳ)如果jcxz (CX) = 0cx的含量為0,則將被轉移。
註:(壹)根據條件碼的值移位;(ii)比較兩個無符號數,並根據比較結果進行移位。
(iii)比較兩個有符號數,並根據比較結果進行移位(iv)根據CX寄存器的值進行移位。
例子
1050:0000 b 86610 MOV AX,1040
1050:00038ED8 MOV DS,AX
1050:0005B90500 MOV CX,0005
MOV BX,0000
1050:000D0207再次:加AL,[BX]
1050:000 f43 BX公司
1050:001049 CX
1050:001175 fa JNZ 000d
1050:0013a 20500 MOV[0005],阿爾
MOV啊,4C
1050:0018cd 21 INT 21
假設程序比較兩個有符號數,根據比較結果分支,其中(AL)=80H,(BL)=01。請指出以下兩組指令的轉向地址。
⑴ CMP AL,BL ⑵ CMP AL,BL
JL XY JB XY
回答:(1)轉到目標地址xy;(2)無法實現轉移。
執行CMP指令時,(Al)-(BL) = 80-01 = 7f,條件碼設置為SF=0,OF=1,CF=0。當執行JL指令時,測試分支條件:SFOF = 0 1 =1,這意味著滿足(Al) < (BL)的分支條件。因此,當(IP)←XY的地址偏移時,程序被轉移到XY單元以執行新指令。
JB指令的轉移條件是CF=1,CMP的執行結果使CF=0,所以不能引起轉移。