汇编语言——控制转移类指令

  • 控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令
  • 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令

1、无条件转移指令

  • JMP label ; 程序转向label标号指定的地址

  • 只要执行无条件转移指令JMP,就使程序转到制定的目标地址处,从目标地址处开始执行指令

  • 操作数label是要转移到的目标地址

  • JMP指令分成4种类型

    • 段内转移、直接寻址
    • 段内转移、间接寻址
    • 段间转移、直接寻址
    • 段间转移、间接寻址

根据转移的距离,JMP指令可分为两类:段内转移和段间转移
段内转移是在同一代码段内进行,又称近转移,只要修改IP的值即可实现;段间转移可以在不同代码之间进行,又称远转移,需要同时修改CS和IP的值。
根据目标地址的指定方式,JMP指令又可分为两类:直接转移和间接转移
直接转移是指转移的目标地址直接出现在指令中,在程序执行前就已经确定;间接转移是指转移的目标地址是寄存器或内存操作数的值,只有执行到该条指令时才能确定

EG.(1)段间直接转移:修改CS和IP的值,目标地址直接出现在指令中

jmp  段地址:偏移地址
jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令
jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取指令
CPU读取指令地址计算方法=CSx16+IP

EG.(2)段内间接转移:只修改IP的值,目标地址存放在寄存器中

jmp 某一合法寄存器 指令的功能为:用寄存器中的值修改IP
jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H
       指令执行后:ax=1000H,CS=2000H,IP=1000H
jmp bx,指令执行前:ax=0B16H,CS=2000H,IP=0003H
       指令执行后:ax=0B16H,CS=2000H,IP=0B16H
jmp ax,含义上好似:mov IP,ax

!!!注意:如果jmp内存操作数是字类型,则masm自动产生段内间接转移;若内存操作数是双字类型,则masm自动产生段间间接转移。当不能确定类型时,masm将报错。

jmp  [BX]  ;   错误,[BX]类型不确定
jmp  word ptr [BX]  ;  段内间接转移
jmp  dowrd ptr [BX]  ;  段间间接转移

2、条件转移指令

  • 条件转移指令的一般形式为:
Jcc label  ;  若条件成立,则IP=label的偏移地址。其中,label是标号。
  • 功能:若条件成立,则转移到目标地址label;否则,CPU忽略该条件转移,继续执行下一条指令
  • 对标志位的影响:无
  • Jcc指令的分类:

(1)测试单个标志位的Jcc指令

Jcc指令描述转移条件
JC,JB,JANE有进位时转移CF=1
JNC,JNB,JAE无进位时转移CF=0
JZ,JE为零(相等)时转移ZF=1
JNZ,JNE非零(不等)时转移ZF=0
JS为负时转移SF=1
JNS为正时转移SF=0
JO溢出时转移OF=1
JNO不溢出时转移OF=0
JP,JPE1的个数为偶数时转移PF=1
JNP,JPO1的个数为奇数时转移PF=0

(2)用于带符号数比较的Jcc指令。常用在CMP指令之后,以判断带符号数的大小。

Jcc指令描述转移条件
JG,JNEL大于(不小于等于)时转移SF=OF且ZF=0
JGE,JNL大于等于(不小于)时转移SF=OF
JL,JNGE小于(不大于等于)时转移SF<>OF
JLE,JNG小于等于(不大于)时转移SF<>OF或ZF=1

(3)用于无符号数比较的Jcc指令。常用在CMP指令之后,以判断无符号数的大小。

Jcc指令描述转移条件
JA,JNBE高于(不低于等于)时转移CF=0且ZF=0
JAE,JNE高于等于(不低于)时转移CF=0
JB,JNAE低于(不高于等于)时转移CF=1
JBE,JNA低于等于(不高于)时转移CF=1且ZF=1

3、loop指令

  • loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,为不是目的地址。对IP的修改范围都为:-128~127
  • 指令格式:loop label (cx=cx-1,如果cx不等于0,转移到标号处)
  • loop标号的功能相当于
(cx)--if((cx)!=0) jmp short label;
  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值