Fab*_*llo 7 x86 assembly branch
这个:
testl %esi, %esi
jle .L3
movl %esi, %eax
Run Code Online (Sandbox Code Playgroud)
如果testl对esi结果的逻辑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转换中,如果.L3由popthen ret和分支组成,则可以确定函数返回的值吗?
Mic*_*ael 11
"小于或等于"定义为: ZF=1 or SF != OF
该TEST指令设置ZF并SF基于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)