这是:
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翻译中,如果.L3由pop组成,那么ret和分支发生时,就可以确定函数返回的值了吗?
发布于 2013-07-01 18:32:33
“小于或等于”定义为:ZF=1 or SF != OF
TEST指令基于操作数之间的逻辑AND设置ZF和SF,并清除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++;
}
}
} https://stackoverflow.com/questions/17411048
复制相似问题