c - 在给定汇编代码的情况下查找丢失的 C 代码?

标签 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

问题要求我找出缺失的测试表达式必须是什么才能产生给定的汇编代码。好的,很简单。 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/

相关文章:

assembly - 8086 和 x86 汇编语言的区别

assembly - 有关新 AVR 指令 LAC、LAS、LAT 和 XCH 的更多详细信息

python - 如何从 32 位 Python 访问 64 位 Windows 环境变量?

unix - Go 中 Syscall.RawSyscall() 和 Syscall.Syscall() 的详细信息?

assembly - 找到一个空闲的中断槽

assembly - 如何在汇编中div后显示11.1?

c++ - 手动添加 vector 异常处理程序

c - 需要有关 C 中函数指针的建议

c - 在使用完整页堆的 buf = malloc(1) 后,为什么直到 buf[16] 被覆盖时才抛出保护页异常?

c - 在C中为二维数组分配内存的最佳方法?