跳转指令
条件码大量用于条件执行
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 里面去.