6.3 条件跳转
6.3.1 条件结构
在IA-32指令集中没有高级的逻辑结构,但无论多么复杂的结构,都可以使用比较和跳转指令组合来实现。执行条件语句包括两个步骤:首先,使用CMP,AND,SUB之类的指令修改CPU标志六七次,使用条件跳转指令测试并导致向新地址的分支转移。
例子1:使用CMP指令比较AL和0,如果CPU指令设置了零标志,那么JZ(为0则跳转)指令就跳转到标号L1处:
cmp al ,0
jz L1
.
.
L1:
6.3.2 条件跳转(Jcond)指令
条件跳转指令在标志条件为真时分支跳转到新的目的标号处,如果条件标志为假,那么执行紧跟在跳转跳转指令之后的指令。格式如下:
jcond 目标地址
格式中的cond指的是一个标志条件,用来表示一个或多个标志的状态。例如:
jc 如果进位则跳转
jnc 如果无进位则跳转
jz 如果为零则跳转
jnz 如果不为零则跳转
我们已经知道算数指令。比较指令和布尔指令几乎重视会设置标志位、条件跳转指令检查标志位的状态并且根据标志位的状态决定是否跳转。
限制:MASM在默认情况下要求跳转的目的地址在当前的过程之内,为了突破这种限制,可以声明一个全局标号(标号后面跟”::”):
jc MyLabel
.
.
MyLabel::
通常,应尽量避免跳转到当前的过程之外,否则调试程序时会比较困难。
在Intel386之前,跳转的目标地址被限制在跳转指令后的第一条指令+128~-127个字节范围之内。IA-32处理器可跳转到当前段内的任何地址。
使用CMP指令:假设我们想在AX等于5时跳转到位置L1处。假设AX等于5,CMP指令设置了零标志,由于零标志置位了,执行JE指令就会发生跳转:
cmp ax,5
je L1 ;相等则跳转
如果AX不等于5,CMP就会清楚零标志,执行JE指令就不会发生跳转,在下面的例子中,由于AX小于6而发生了跳转:
mov ax ,5
cmp ax,6
jl L1 ;如果小于则跳转大于是(jg)
6.3.3 条件跳转指令的类型
IA-32指令集中跳转中的数目惊人地多,支持根据有符号、无符号整数的比较以及对CPU状态标志的检查进行跳转的一系列指令,跳转跳转指令可分成下面四类:
1.基于特定的标志值。
2.根据两个操作数是否相等,或根据(E)CX的值的。
3.基于无符号操作数的比较结果的。
4.基于有符号操作数的比较结果的。
下表列出了基于特定CPU