x86-64装配测试 - jle

时间:2013-07-01 18:19:13

标签: assembly x86 branch

此:

testl   %esi, %esi
jle .L3
movl    %esi, %eax

如果testlesi执行逻辑AND,则结果不能更少但只有等于,如果{{1}这是esi无法达到的。{}为0。这是真的,或者我错过了一些事情。

第二步:

movl

在假设的C语言翻译中,如果f1: pushq %rbp movq %rsp, %rbp testl %esi, %esi jle .L3 movl %esi, %eax .L2: incb (%rdi) incq %rdi decq %rax jne .L2 .L3: popq %rbp ret .L3然后pop组成并且分支发生,则可以确定该函数返回的值吗?

1 个答案:

答案 0 :(得分:10)

“小于或等于”定义为:ZF=1 or SF != OF

TEST指令根据操作数之间的逻辑ZF设置SFAND,并清除OF

所以实际上你最终得到条件ZF or SF,意思是“小于或等于零”(即在这种情况下,如果(signed int)esi <= 0则会跳转)。

修改:对于问题的第二部分,它看起来像是在做这些事情:

void f1(char *c, int len)
{
    if (len > 0) {
        for (i = len; i != 0; i--) {
            (*c)++;
            c++;   
        }
    }
}