控制轉移指令透過改變CS:IP來控制程式的執行流程。這類指令包括無條件轉移指令、條件轉移指令、迴圈指令、子程式呼叫和返回指令以及中斷和中斷返回指令。 ⑴ 無條件轉移 JMP 跳轉 ⑵ 條件轉移 JZ/JNZ 結果為零/不為零則轉移 JS/JNS 結果為負/為正則轉移 JO/JNO 溢位/不溢位則轉移 JP/JNP 奇偶位為1/為0則轉移 JB/JNB 低於/不低於則轉移 JBE/JNBE 低於等於/高於則轉移 JL/JNL 小於/不小於則轉移 JLE/JNLE 小於等於/大於則轉移 JCXZ CX為零則轉移 ⑶ 迴圈指令 LOOP 迴圈 LOOPZ/LOOPE 為零/相等時迴圈 LOOPNZ/LOOPNE 不為零/不等時迴圈 ⑷ 子程式呼叫與返回 CALL 呼叫 RET 返回 ⑸ 中斷及中斷返回 INT 中斷 INTO 溢位則中斷 IRET 中斷返回 程式中指令的執行順序是由CS:IP來決定的,程式轉移類指令可改變IP或CS、IP的內容,從而控制指令的執行順序,實現指令轉移、程式呼叫等功能。 1 無條件轉移指令 JMP指令控制程式無條件地跳轉到目的單元,使用JMP指令可有三種格式: ⑴ JMP SHORT label 短轉移(short jump) ⑵ JMP NEAR PTR label 近轉移(near jump) ● JMP label 直接轉移(direct jump) ● JMP reg 暫存器間接轉移(register indirect jump) ● JMP WORD PTR OPR 儲存器間接轉移(memory indirect jump) ⑶ JMP FAR PTR label 遠轉移(far jump) 短轉移的目標地址(或稱轉向地址)相對於當前IP值的位移量在-128至+127位元組之間,當前IP值是指JMP指令的下一條指令的地址(如圖3.11所示)。對短轉移JMP,機器指令的第一個位元組為操作碼EB,第二個位元組為位移量00~FF,這是一個帶符號的補碼數。轉向地址的計算方法為:(IP)當前+8位位移量。運算子SHORT指示彙編程式將JMP指令彙編成一個2位元組指令。 ⑴ JMP SHORT label 短轉移(short jump) 執行操作:(IP) ← (IP)當前+8位位移量 短轉移示意圖 ⑵ JMP NEAR PTR label 近轉移(near jump) 近轉移是JMP指令的預設格式,可以寫為"JMP label"。它可在當前程式碼段內轉移,機器指令的操作碼是E9,位移量是16位的帶符號補碼數。指令中的轉向地址可以是直接定址方式、暫存器定址方式、暫存器間接方式和儲存器定址方式。 ● JMP label 直接轉移(direct jump) 執行操作:(IP) ← OFFSET label = (IP)當前+16位位移量 轉移的目標地址在指令中可直接使用符號地址,由於位移量為16位,它的轉移範圍應是-32768至+32767,也就是說,近轉移指令可以轉移到段內的任一個位置。 ● JMP reg 暫存器間接轉移(register indirect jump) 執行操作:(IP) ← (reg) 轉移的目標地址在暫存器中,例如指令"JMP BX"執行的結果,將BX的內容送給IP。 ● JMP WORD PTR OPR 儲存器間接轉移(memory indirect jump) 執行操作:(IP) ← (PA+1,PA) 儲存器的物理地址PA由指令中的定址方式確定,JMP指令執行的結果,把PA單元的字內容送到IP暫存器中。例如"JMP WORD PTR [DI]",物理地址PA = (DS)×24+(DI),指令執行的結果是(IP)= (PA+1,PA)。 ⑶ JMP FAR PTR label 遠轉移(far jump) 執行操作:(IP) ← label的段內偏移地址 (CS) ← label所在段的段地址 遠轉移實現的是段間的跳轉,即從當前程式碼段跳轉到另一個程式碼段中,這意味著指令執行後,不僅要改變IP的值,CS也會得到一個新的段地址。在彙編指令中,遠轉移的目標地址也可以使用除立即定址方式外的任何定址方式來表示。 2 條件轉移指令(conditional jump) 條件轉移指令是在滿足了規定的條件後才控制程式轉移的一類指令,8086的條件轉移指令總結在表3.4中。 所有條件轉移指令都是短轉移指令,轉移的目標地址必須在當前IP地址的-128至+127位元組範圍之內,因此條件轉移指令是2位元組指令。 計算轉向地址的方法和無條件短轉移指令是一樣的,看例3.40的反彙編程式碼。 例3.40程式中的"JNZ AGAIN"彙編成"JNZ 000D",000D是標號AGAIN的地址,指令"JNZ 000D"的機器程式碼是75FA,75是操作碼,FA是位移量。當CPU讀取JNZ指令後,IP暫存器自動加2(JNZ的指令長度)指向了下一條指令(MOV),此時IP的當前值是0013。計算轉向地址時,(IP)當前+位移量 = 0013+FA = 0013+FFFA = 000D,這正是AGAIN的偏移地址。實際上FA是-6的補碼,8位的FA與16位的0013相加時,FA符號擴充套件成為FFFA,相加的加結果為000D。 表3.4 條件轉移指令 分類 指 令 轉 移 條 件 說 明 (Ⅰ) JZ/JE ZF=1 為零/相等, 則轉移 JNZ/JNE ZF=0 不為零/不相等, 則轉移 JS SF=1 為負, 則轉移 JNS SF=0 為正, 則轉移 JO OF=1 溢位, 則轉移 JNO OF=0 不溢位, 則轉移 JP PF=1 奇偶位為1, 則轉移 JNP PF=0 奇偶位為0, 則轉移 JC CF=1 進位位為1, 則轉移 JNC CF=0 進位位為0, 則轉移 (Ⅱ) JB/JNAE/JC CF=1 低於/不高於等於, 則轉移 JNB/JAE/JNC CF=0 不低於/高於等於, 則轉移 JBE/JNA (CF ZF)=1 低於等於/不高於, 則轉移 JNBE/JA (CF ZF)=0 不低於等於/高於, 則轉移 (Ⅲ) JL/JNGE (SF OF)=1 小於/不大於等於, 則轉移 JNL/JGE (SF OF)=0 不小於/大於等於, 則轉移 JLE/JNG ((SF OF) ZF)=1 小於等於/不大於, 則轉移 JNLE/JG ((SF OF) ZF)=0 不小於等於/大於, 則轉移 (Ⅳ) JCXZ (CX)=0 CX的內容為0, 則轉移 注: (Ⅰ)根據條件碼的值轉移 (Ⅱ)比較兩個無符號數,根據比較的結果轉移 (Ⅲ)比較兩個帶符號數,根據比較的結果轉移 (Ⅳ)根據CX暫存器的值轉移 例 1050:0000 B86610 MOV AX,1040 1050:0003 8ED8 MOV DS,AX 1050:0005 B90500 MOV CX,0005 1050:0008 BB0000 MOV BX,0000 1050:000D 0207 AGAIN: ADD AL,[BX] 1050:000F 43 INC BX 1050:0010 49 DEC CX 1050:0011 75FA JNZ 000D 1050:0013 A20500 MOV [0005],AL 1050:0016 B44C MOV AH,4C 1050:0018 CD21 INT 21 例 假設程式進行兩個帶符號數的比較,並根據比較結果轉移,其中(AL)=80H,(BL)=01,請指出下面 兩組指令的轉向地址。 ⑴ CMP AL,BL ⑵ CMP AL,BL JL XY JB XY 答:⑴ 轉向目標地址XY;⑵不能實現轉移。 執行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,所以不能引起轉移。
控制轉移指令透過改變CS:IP來控制程式的執行流程。這類指令包括無條件轉移指令、條件轉移指令、迴圈指令、子程式呼叫和返回指令以及中斷和中斷返回指令。 ⑴ 無條件轉移 JMP 跳轉 ⑵ 條件轉移 JZ/JNZ 結果為零/不為零則轉移 JS/JNS 結果為負/為正則轉移 JO/JNO 溢位/不溢位則轉移 JP/JNP 奇偶位為1/為0則轉移 JB/JNB 低於/不低於則轉移 JBE/JNBE 低於等於/高於則轉移 JL/JNL 小於/不小於則轉移 JLE/JNLE 小於等於/大於則轉移 JCXZ CX為零則轉移 ⑶ 迴圈指令 LOOP 迴圈 LOOPZ/LOOPE 為零/相等時迴圈 LOOPNZ/LOOPNE 不為零/不等時迴圈 ⑷ 子程式呼叫與返回 CALL 呼叫 RET 返回 ⑸ 中斷及中斷返回 INT 中斷 INTO 溢位則中斷 IRET 中斷返回 程式中指令的執行順序是由CS:IP來決定的,程式轉移類指令可改變IP或CS、IP的內容,從而控制指令的執行順序,實現指令轉移、程式呼叫等功能。 1 無條件轉移指令 JMP指令控制程式無條件地跳轉到目的單元,使用JMP指令可有三種格式: ⑴ JMP SHORT label 短轉移(short jump) ⑵ JMP NEAR PTR label 近轉移(near jump) ● JMP label 直接轉移(direct jump) ● JMP reg 暫存器間接轉移(register indirect jump) ● JMP WORD PTR OPR 儲存器間接轉移(memory indirect jump) ⑶ JMP FAR PTR label 遠轉移(far jump) 短轉移的目標地址(或稱轉向地址)相對於當前IP值的位移量在-128至+127位元組之間,當前IP值是指JMP指令的下一條指令的地址(如圖3.11所示)。對短轉移JMP,機器指令的第一個位元組為操作碼EB,第二個位元組為位移量00~FF,這是一個帶符號的補碼數。轉向地址的計算方法為:(IP)當前+8位位移量。運算子SHORT指示彙編程式將JMP指令彙編成一個2位元組指令。 ⑴ JMP SHORT label 短轉移(short jump) 執行操作:(IP) ← (IP)當前+8位位移量 短轉移示意圖 ⑵ JMP NEAR PTR label 近轉移(near jump) 近轉移是JMP指令的預設格式,可以寫為"JMP label"。它可在當前程式碼段內轉移,機器指令的操作碼是E9,位移量是16位的帶符號補碼數。指令中的轉向地址可以是直接定址方式、暫存器定址方式、暫存器間接方式和儲存器定址方式。 ● JMP label 直接轉移(direct jump) 執行操作:(IP) ← OFFSET label = (IP)當前+16位位移量 轉移的目標地址在指令中可直接使用符號地址,由於位移量為16位,它的轉移範圍應是-32768至+32767,也就是說,近轉移指令可以轉移到段內的任一個位置。 ● JMP reg 暫存器間接轉移(register indirect jump) 執行操作:(IP) ← (reg) 轉移的目標地址在暫存器中,例如指令"JMP BX"執行的結果,將BX的內容送給IP。 ● JMP WORD PTR OPR 儲存器間接轉移(memory indirect jump) 執行操作:(IP) ← (PA+1,PA) 儲存器的物理地址PA由指令中的定址方式確定,JMP指令執行的結果,把PA單元的字內容送到IP暫存器中。例如"JMP WORD PTR [DI]",物理地址PA = (DS)×24+(DI),指令執行的結果是(IP)= (PA+1,PA)。 ⑶ JMP FAR PTR label 遠轉移(far jump) 執行操作:(IP) ← label的段內偏移地址 (CS) ← label所在段的段地址 遠轉移實現的是段間的跳轉,即從當前程式碼段跳轉到另一個程式碼段中,這意味著指令執行後,不僅要改變IP的值,CS也會得到一個新的段地址。在彙編指令中,遠轉移的目標地址也可以使用除立即定址方式外的任何定址方式來表示。 2 條件轉移指令(conditional jump) 條件轉移指令是在滿足了規定的條件後才控制程式轉移的一類指令,8086的條件轉移指令總結在表3.4中。 所有條件轉移指令都是短轉移指令,轉移的目標地址必須在當前IP地址的-128至+127位元組範圍之內,因此條件轉移指令是2位元組指令。 計算轉向地址的方法和無條件短轉移指令是一樣的,看例3.40的反彙編程式碼。 例3.40程式中的"JNZ AGAIN"彙編成"JNZ 000D",000D是標號AGAIN的地址,指令"JNZ 000D"的機器程式碼是75FA,75是操作碼,FA是位移量。當CPU讀取JNZ指令後,IP暫存器自動加2(JNZ的指令長度)指向了下一條指令(MOV),此時IP的當前值是0013。計算轉向地址時,(IP)當前+位移量 = 0013+FA = 0013+FFFA = 000D,這正是AGAIN的偏移地址。實際上FA是-6的補碼,8位的FA與16位的0013相加時,FA符號擴充套件成為FFFA,相加的加結果為000D。 表3.4 條件轉移指令 分類 指 令 轉 移 條 件 說 明 (Ⅰ) JZ/JE ZF=1 為零/相等, 則轉移 JNZ/JNE ZF=0 不為零/不相等, 則轉移 JS SF=1 為負, 則轉移 JNS SF=0 為正, 則轉移 JO OF=1 溢位, 則轉移 JNO OF=0 不溢位, 則轉移 JP PF=1 奇偶位為1, 則轉移 JNP PF=0 奇偶位為0, 則轉移 JC CF=1 進位位為1, 則轉移 JNC CF=0 進位位為0, 則轉移 (Ⅱ) JB/JNAE/JC CF=1 低於/不高於等於, 則轉移 JNB/JAE/JNC CF=0 不低於/高於等於, 則轉移 JBE/JNA (CF ZF)=1 低於等於/不高於, 則轉移 JNBE/JA (CF ZF)=0 不低於等於/高於, 則轉移 (Ⅲ) JL/JNGE (SF OF)=1 小於/不大於等於, 則轉移 JNL/JGE (SF OF)=0 不小於/大於等於, 則轉移 JLE/JNG ((SF OF) ZF)=1 小於等於/不大於, 則轉移 JNLE/JG ((SF OF) ZF)=0 不小於等於/大於, 則轉移 (Ⅳ) JCXZ (CX)=0 CX的內容為0, 則轉移 注: (Ⅰ)根據條件碼的值轉移 (Ⅱ)比較兩個無符號數,根據比較的結果轉移 (Ⅲ)比較兩個帶符號數,根據比較的結果轉移 (Ⅳ)根據CX暫存器的值轉移 例 1050:0000 B86610 MOV AX,1040 1050:0003 8ED8 MOV DS,AX 1050:0005 B90500 MOV CX,0005 1050:0008 BB0000 MOV BX,0000 1050:000D 0207 AGAIN: ADD AL,[BX] 1050:000F 43 INC BX 1050:0010 49 DEC CX 1050:0011 75FA JNZ 000D 1050:0013 A20500 MOV [0005],AL 1050:0016 B44C MOV AH,4C 1050:0018 CD21 INT 21 例 假設程式進行兩個帶符號數的比較,並根據比較結果轉移,其中(AL)=80H,(BL)=01,請指出下面 兩組指令的轉向地址。 ⑴ CMP AL,BL ⑵ CMP AL,BL JL XY JB XY 答:⑴ 轉向目標地址XY;⑵不能實現轉移。 執行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,所以不能引起轉移。