此:
testl %esi, %esi
jle .L3
movl %esi, %eax
如果testl
对esi
执行逻辑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
组成并且分支发生,则可以确定该函数返回的值吗?
答案 0 :(得分:10)
“小于或等于”定义为: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++;
}
}
}