6_跳转指令

跳转指令

条件码大量用于条件执行

  • jX 指令系列

依赖当前的条件码选择下一条执行语句 (就是看你是顺着执行还是跳着执行)

jX 条件 描述
jmp 1 无条件跳转指令
je ZF Equal / Zero
jne ~ZF Not Equal / Not Zero
js SF Negative
jns ~SF Nonnegative
jg ~(SF ^ OF) & ~ZF Greater (Signed)
jge ~(SF ^ OF) Greater or Equal (Signed)
jl (SF ^ OF) Less (Signed)
jle (SF ^ OF)|ZF Less or Equal (Signed)
ja ~CF & ~ZF Above (unsigned)
jb CF Below (unsigned)

条件跳转指令实例

int absdiff(int x, int y)
{
    int result;
    if (x > y)
    {
        result = x - y;
    }
    else
    {
        result = y - x;
    }
    return result;
}

求这两个参数, 差的绝对值

我们编译生成以下代码 :

absdiff :

;Set up

    pushl %ebp
    movl %esp, $ebp
    movl 8(%ebp), %edx
    movl 12(%ebp), %eax

;Body 1

    cmpl %eax, %edx
    jle .L7
    subl %eax, %edx
    movl %edx, %eax

;Finish

.L8 :
    leave
    ret

;Body 2

.L7 :
    subl %edx, %eax
    jmp .L8

这个很简单, 关键就是这个 cmpl 指令, 就是 eax 和 edx 相比较. 实际上是 edx 减去 eax.

那么再往上看, movl ebp 8 到 edx, movl ebp 12 到 eax, 这实际上就是把两个参数都取进来了. 就是把 x y 取进来, 然后相减, 然后就是比较大小.

如果小于等于就用 eax 减去 edx, 反之就是用 edx 减去 eax.

最后当然是结果存到 eax 里面去.