2013-07-01 23 views
3

此:X86-64组装测试 - JLE

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译法如果.L3pop然后ret和分支发生有可能确定由函数的返回值?

回答

7

“小于或等于”被定义为:ZF=1 or SF != OF

TEST指令基于所述操作数之间的逻辑AND设置ZFSF,并清除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++; 
     } 
    } 
} 
+0

在假设C译法如果'.L3'由leave'和'RET的' '和分支发生,这意味着函数返回'0'?否则,如果'jle'失败,在'movl'指令后面有一个结语,那么这意味着该函数返回整数值'eax'? –

+0

积分值在IA-32的'eax'中返回,所以在你描述的场景中,如果esi> 0,它将返回'esi'的值,否则它将返回'eax'中已有的值。 – Michael

+0

如果我没有这些信息,我无法确定返回什么值? –