前言:记录一下汇编中难懂的指令。(IA-32 架构)
test
testl %eax, %eax
jle .L1
testl 就是按位与操作,最后的值还是 R[eax]。但它会用 R[eax] 的值更新 flags。主要看 ZF
和 SF
如果 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
释放所有栈内容并返回到调用过程的下条指令
还有啥。。。以后再记录。。