10

这个:

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

如果testl对结果进行逻辑与esi不能永远小于但只能等于,如果esi是0。这样movl就无法达到。这是真的,或者我错过了一些东西。

第二步:

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

在假设的 C 语言翻译中,如果.L3popthenret和分支组成,是否可以确定函数返回的值?

4

1 回答 1

17

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

TEST指令集ZF和操作数之间基于SF逻辑AND,并清除OF

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

编辑:对于你问题的第二部分,看起来它正在按照以下方式做一些事情:

void f1(char *c, int len)
{
    if (len > 0) {
        for (i = len; i != 0; i--) {
            (*c)++;
            c++;   
        }
    }
} 
于 2013-07-01T18:32:33.603 回答