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

      

  • 相关阅读:
    SpringBoot中获取上下文
    @Import
    SpringBoot集成Swagger-Bootstrap-UI(已改名为Knife4j)
    SpringFox 3.0.0(包含springfox-swagger2-3.0.0)——无法访问/swagger-ui.html解决方案
    容器编排技术 docker compose 20210816
    SC Nacos 服务注册和发现202107
    GitHub Desktop报错 Authentication failed. Some common reasons include
    arcgis esriGeometryType
    小程序H5接口测试整理(JMeter)
    python+检查图像文件是否损坏,是,删除
  • 原文地址:https://www.cnblogs.com/ZanderZhao/p/11054484.html
Copyright © 2020-2023  润新知