代码是
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
这个问题要求我找出缺少的测试表达式,以产生给定的汇编代码。好的,够容易的。 x
和y
之间存在明显的比较。如果jge
,12(%ebp) > %eax
运算符将会跳转到循环体中。
可能的选择是
x<=y
x>=y
x>y
x<y
我的回答是x<=y
,因为12(%ebp)
是对y
的引用,而且它是目的地。但这个答案是错误的,我不知道如何。任何提示?非常感谢。
答案 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
gcc test.c -m32 -Wa,-ahln -fno-asynchronous-unwind-tables
您会看到test.c
的程序集。查找f1:
和f2:
,它们是函数的入口点。哪一个与您的代码段匹配?您会看到f1
匹配,而f2
处理jle
。