找到缺少的C代码,给定汇编代码?

时间:2015-10-25 17:53:14

标签: c assembly x86

代码是

int f(int x, int y, int z) {
  if (/* missing code here */)
    return z;
  else
    return -z;
}

装配是

    pushl %ebp
    movl %esp, %ebp
    movl 8(%ebp), %eax
    cmpl 12(%ebp), %eax
    jge .L2
    movl 16(%ebp), %eax
    jmp .L3
.L2:
    movl 16(%ebp), %eax
    negl %eax
.L3:
    popl %ebp
    ret

这个问题要求我找出缺少的测试表达式,以产生给定的汇编代码。好的,够容易的。 xy之间存在明显的比较。如果jge12(%ebp) > %eax运算符将会跳转到循环体中。

可能的选择是

x<=y x>=y x>y x<y

我的回答是x<=y,因为12(%ebp)是对y的引用,而且它是目的地。但这个答案是错误的,我不知道如何。任何提示?非常感谢。

2 个答案:

答案 0 :(得分:5)

这是带注释的x86程序集:

pushl %ebp ; save the old stack movl %esp, %ebp ; set up your local, new stack movl 8(%ebp), %eax ; take the first function argument and store it into eax cmpl 12(%ebp), %eax ; compare the 2nd function arg with the 1st (in eax)

在此之后,有jge这意味着,基本上,#34;如果大于或等于&#34;则会跳转,这可以在cmp指令后执行。

这意味着如果第一个参数大于第二个参数,则跳转,因此x >= y

然而,这个跳转(到L2)实际上会否定z,然后返回z。 你真正想要的是跳转到L3,如果x&lt; y,这应该是最终结果。

答案 1 :(得分:2)

你可以问GCC,它会做什么。创建具有多个功能的源:

<强> test.c的

int f1 (int x, int y, int z) {
  if (x < y)
    return z;
  else
    return -z;
}

int f2 (int x, int y, int z) {
  if (x > y)
    return z;
  else
    return -z;
}

int main ( void )
{
    return 0;
}

f1执行(x f2执行(x&gt; y)。现在构建它:

gcc test.c -m32 -Wa,-ahln -fno-asynchronous-unwind-tables

您会看到test.c的程序集。查找f1:f2:,它们是函数的入口点。哪一个与您的代码段匹配?您会看到f1匹配,而f2处理jle