• 汇编语言条件跳转简介

    x86 指令集中没有明确的高级逻辑结构,但是可以通过比较和跳转的组合来实现它们。

    执行一个条件语句需要两个步骤:

    • 第一步,用 CMP、AND 或 SUB 操作来修改 CPU 状态标志位;
    • 第二步,用条件跳转指令来测试标志位,并产生一个到新地址的分支。

    下面是一些例子。

    【示例 1】本例中的 CMP 指令把 EAX 的值与 0 进行比较,如果该指令将零标志位置 1,则 JZ(为零跳转)指令就跳转到标号 L1:

            cmp eax, 0
            jz L1                   ;如果 ZF=1 则跳转
            .
            .
    L1:

    【示例 2】本例中的 AND 指令对 DL 寄存器进行按位与操作,并影响零标志位。如果零标志位清零,则 JNZ(非零跳转)指令跳转:

            and dl,10110000b
            jnz L2                         ;如果 ZF=0 则跳转
            .
            .
    L2 :

    Jcond 指令

    当状态标志条件为真时,条件跳转指令就分支到目标标号。否则,当标志位条件为假时,立即执行条件跳转后面的指令。语法如下所示:

    Jcond destination

    cond 是指确定一个或多个标志位状态的标志位条件。下面是基于进位和零标志位的例子:

    JC 进位跳转(进位标志位置 1)
    JNC 无进位跳转(进位标志位清零)
    JZ 为零跳转(零标志位置 1)
    JNZ 非零跳转(零标志位清零)

    CPU 状态标志位最常见的设置方法是通过算术运算、比较和布尔运算指令。条件跳转指令评估标志位状态,利用它们来决定是否发生跳转。

    用 CMP 指令 假设当 EAX=5 时,跳转到标号 L1。在下面的例子中,如果 EAX=5,CMP 指令就将零标志位置 1;之后,由于零标志位为 1,JE 指令就跳转到 L1:

    cmp eax,5
    je L1                  ;如果相等则跳转

    JE 指令总是按照零标志位的值进行跳转。如果 EAX 不等于 5,CMP 就会清除零标志位,那么,JE 指令将不跳转。

    下例中,由于 AX 小于 6,所以 JL 指令跳转到标号 L1:

    mov ax, 5
    cmp ax, 6
    jl L1                 ;小于则跳转

    下例中,由于 AX 大于4,所以发生跳转:

    mov ax,5
    cmp ax,4
    jg L1              ;大于则跳转

更多...

加载中...