171.控制转移指令

拟墨画扇 提交于 2021-01-13 00:39:35

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、IRET

 

 2.无条件转移指令

段内直接短转移:JMP SHORT OPR
  执行操作:(IP) ← (IP) + 8位位移量

 

段内直接近转移:JMP NEAR PTR OPR
  执行操作:(IP) ← (IP) + 16位位移量

 

段内间接转移: JMP WORD PTR OPR
  执行操作: (IP) ← (EA)

 

段间直接远转移:JMP FAR PTR OPR
  执行操作:(IP) ← OPR 的段内偏移地址
       (CS) ← OPR 所在段的段地址

 

段间间接转移: JMP DWORD PTR OPR
  执行操作: (IP) ← (EA)
        (CS) ← (EA+2)

 

3.条件转移指令

注意:只能使用段内直接寻址的8 位位移量

3.1根据单个条件标志的设置情况转移

      格式 测试条件  
  JZ(JE)  OPR ZF=1

jump if zero,or equal

结果为零(或相等)则转移

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 指令执行完,标志位由堆栈中取出的值确定

 

 

 

 

 

 

 

 

 

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!