- 控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令
- 可以修改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,JPE | 1的个数为偶数时转移 | PF=1 |
JNP,JPO | 1的个数为奇数时转移 | 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;