这个:
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
并且发生分支,可以确定函数返回的值吗?
最佳答案
“小于或等于”定义为: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++;
}
}
}
关于assembly - x86-64组装测试-JLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17411048/