x86-64装配测试 - jle

Fab*_*llo 7 x86 assembly branch

这个:

testl   %esi, %esi
jle .L3
movl    %esi, %eax
Run Code Online (Sandbox Code Playgroud)

如果testlesi结果的逻辑AND 不能永远不会但只有等于,则if 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
Run Code Online (Sandbox Code Playgroud)

在假设的C转换中,如果.L3popthen ret和分支组成,则可以确定函数返回的值吗?

Mic*_*ael 11

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

TEST指令设置ZFSF基于AND操作数之间的逻辑,并清除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++;   
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)