汇编难懂的指令

前言:记录一下汇编中难懂的指令。(IA-32 架构)

test

testl %eax, %eax
jle .L1

testl 就是按位与操作,最后的值还是 R[eax]。但它会用 R[eax] 的值更新 flags。主要看 ZFSF

如果 R[eax] 的值中包含 1。那么 testl %eax, %eax 的值就不可能为 0。也就是这条操作以后,如果 ZF 等于 0。就说明 R[eax] 的值全是 0。

由于是拿 R[eax] 的值更新 flags。当 R[eax] < 0 时,SF = 1。也就可以配合 jle 指令了。

想把这个代码转换成汇编代码。

void test(int a) {
    if(a <= 0) {
        return 1;
    }
    return 2;
}

转换结果:

movl 8(%ebp), %eax
testl %eax, %eax

jle .L1
movl $2, %eax

.L1:
movl $1, %eax

leave ret

这两条指令通常放在一起,等价于

movl %ebp, %esp
pop %ebp

pop %eip
jmp %eip

释放所有栈内容并返回到调用过程的下条指令

还有啥。。。以后再记录。。

你可能感兴趣的:(汇编难懂的指令)