代码是
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
的引用,它就是目的地。但是这个答案是错误的,我不知道如何。有什么提示吗?太感谢了。
最佳答案
这是带注释的 x86 程序集:
pushl %ebp ;保存旧堆栈
movl %esp, %ebp ;设置您的本地新堆栈
movl 8(%ebp), %eax ;获取第一个函数参数并将其存储到 eax
cmpl 12(%ebp), %eax ;将第二个函数 arg 与第一个(在 eax 中)进行比较
在此之后,有一个 jge
,其本质上意味着“如果大于或等于则跳转”,您可以在 cmp
指令之后执行此操作。
这意味着如果第一个参数大于第二个参数则跳转,因此 x >= y
。
然而,这个跳转(到 L2)实际上会否定 z,然后返回 z。 您真正想要的是跳转到 L3,如果 x < y 就会发生这种情况,这应该是最终结果。
关于c - 在给定汇编代码的情况下查找丢失的 C 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33332967/