171.控制轉移指令

1.控制轉移指令

 無條件轉移指令
JMP
 條件轉移指令
JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、
JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、
JLE / JNLE、 JCXZ
 循環指令
LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE
 子程序調用和返回指令
CALL、RET
 中斷與中斷返回指令
INT、INTO、IRETless

 

 2.無條件轉移指令

段內直接短轉移:JMP SHORT OPR
  執行操做:(IP) ← (IP) + 8位位移量post

 

段內直接近轉移:JMP NEAR PTR OPR
  執行操做:(IP) ← (IP) + 16位位移量測試

 

段內間接轉移: JMP WORD PTR OPR
  執行操做: (IP) ← (EA)spa

 

段間直接遠轉移:JMP FAR PTR OPR
  執行操做:(IP) ← OPR 的段內偏移地址
       (CS) ← OPR 所在段的段地址3d

 

段間間接轉移: JMP DWORD PTR OPR
  執行操做: (IP) ← (EA)
        (CS) ← (EA+2)blog

 

3.條件轉移指令get

注意:只能使用段內直接尋址的8 位位移量it

3.1根據單個條件標誌的設置狀況轉移

      格式 測試條件  
  JZ(JE)  OPR ZF=1

jump if zero,or equaltable

結果爲零(或相等)則轉移date

JNZ(JNE)  OPR ZF=0
  JS  OPR SF=1

jump if sign

結果爲負則轉移

JNS  OPR  SF=0
  JO   OPR OF=1

jump if overflow

結果溢出則轉移

JNO   OPR OF=0
  JP   OPR PF=1

jump if parity,or parity even

奇偶爲爲1則轉移

JNP   OPR PF=0
  JB(JNAE,JC)  OPR CF=1

低於below,

或者不高於或者等於not above or equal,

或進位爲1則轉移carry

JNB(JAE,JNC)  OPR CF=0

 

3.2比較兩個無符號數,並根據比較結果轉移*

* 適用於地址或雙精度數低位字的比較

    格式          測試條件

<    JB (JNAE,JC) OPR      CF = 1      jump if below (not above or equal , carry)
 ≥    JNB (JAE,JNC) OPR    CF = 0      jump if not below ( above or equal , not carry)
 ≤    JBE (JNA) OPR       CF∨ZF = 1    jump if below or equal (not above)
>    JNBE (JA) OPR      CF∨ZF = 0    jump if not below or equal (above)

 

 3.3 比較兩個帶符號數,並根據比較結果轉移*

* 適用於帶符號數的比較

    格式         測試條件
<   JL (JNGE) OPR    SF∀OF = 1        less, not greater or equal
≥    JNL (JGE) OPR     SF∀OF = 0
≤    JLE (JNG) OPR     (SF∀OF)∨ZF = 1    less or equal, not greater
>   JNLE (JG) OPR    (SF∀OF)∨ZF = 0

 

 3.4 測試 CX 的值爲 0 則轉移

格式                    測試條件
JCXZ OPR         (CX)=0

 

 

 

 

3.循環指令

3.1概述

注意:
* CX 中存放循環次數
* 只能使用段內直接尋址的8 位位移量

 

LOOP
LOOPZ / LOOPE
LOOPNZ / LOOPNE

 

執行步驟:
  (1) (CX) ← (CX) - 1
  (2) 檢查是否知足測試條件,

   如知足則(IP) ← (IP) + 8位位移量,實行循環;
   不知足則 IP 不變,退出循環。

 

3.2指令

循環指令:LOOP OPR
測試條件:(CX) ≠ 0

 

爲零或相等時循環指令:LOOPZ(LOOPE) OPR
測試條件:ZF=1 且 (CX) ≠ 0

 

不爲零或不相等時循環指令:LOOPNZ(LOOPNE) OPR
測試條件:ZF=0 且 (CX) ≠ 0

 

 

 

 

 

 

 

 

 4.子程序調用和返回指令

 

 

 4.1 CALL 調用指令

段內直接近調用:CALL DST
執行操做: (SP) ← (SP) - 2
         ( (SP)+1,(SP) ) ← (IP)
      (IP) ← (IP) + 16位位移量


段內間接近調用:CALL DST
執行操做: (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (IP)
      (IP) ← (EA)

 

段間直接遠調用:CALL DST
執行操做:   (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (CS)
      (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (IP)
      (IP) ← 偏移地址
      (CS) ← 段地址

 

段間間接遠調用:CALL DST
執行操做: (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (CS)
      (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (IP)
      (IP) ← (EA)
      (CS) ← (EA+2)

 

 4.2 RET 返回指令

段內近返回:RET
執行操做: (IP) ← ( (SP)+1,(SP) )
      (SP) ← (SP) + 2

 

段內帶當即數近返回:RET EXP

 

段間遠返回:RET
執行操做: (IP) ← ( (SP)+1,(SP) )
      (SP) ← (SP) + 2
      (CS) ← ( (SP)+1,(SP) )
      (SP) ← (SP) + 2

 

段間帶當即數遠返回:RET EXP

 

 

 

 

 5.中斷指令

 

5.1中斷向量

中斷例行程序的入口地址,存放於中斷向量區。

 

 

 

5.2 中斷指令: INT TYPE 或 INT

執行操做: (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (FLAGS)
      (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (CS)
      (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (IP)
      (IP) ← (TYPE*4)
      (CS) ← (TYPE*4+2)

 

5.3 溢出中斷指令:INTO

執行操做: 若OF=1,(SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (FLAGS)
      (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (CS)
      (SP) ← (SP) - 2
      ( (SP)+1,(SP) ) ← (IP)

      (IP) ← (10H)
      (CS) ← (12H)

 

5.4 從中斷返回指令:IRET

執行操做: (IP) ← ( (SP)+1,(SP) )
      (SP) ← (SP) + 2
      (CS) ← ( (SP)+1,(SP) )
      (SP) ← (SP) + 2
      (FLAGS) ← ( (SP)+1,(SP) )
      (SP) ← (SP) + 2

 

注意:

* TYPE (0~255) 是中斷類型號, 隱含的類型號爲3
* INT 指令還把 IF 和 TF 置0,但不影響其它標誌位
* IRET 指令執行完,標誌位由堆棧中取出的值肯定

 

 

 

 

 

 

相關文章
相關標籤/搜索