x86-64 将“cmovge”汇编为 C 代码

3 c assembly decompiling x86-64

虽然我不应该列出给定的整个 4 行示例(因为这是一个家庭作业问题),但我很困惑应该如何读取它并将其翻译成 C 语言。

cmovge %edi, %eax

到目前为止我所理解的是,该指令是当结果 >= 时的条件移动。它将函数的第一个参数%edi与整数寄存器(在上一行汇编代码中%eax分配了另一个参数值)进行比较。%esi但是,我不明白它的结果。

我的问题是解释优化后的代码。它不操作堆栈,而且我不确定如何用 C 语言编写它(或者至少gcc我什至可以在编译时使用开关来生成相同的结果)。

有人可以举几个小例子来说明如何cmovge将指令转换为 C 代码吗?如果它本身的代码行没有意义,请随意用它来弥补。

这是通过虚拟化 Linux 操作系统 (CentOS 7) 在 x86-64 中进行的组装。

Bjö*_*ist 5

我可能在这里为您提供整个解决方案:

int doit(int a, int b) { return a >= b ? a : b; } 变成gcc -O3 -masm=intel

doit:
.LFB0:
    .cfi_startproc
    cmp edi, esi
    mov eax, esi
    cmovge  eax, edi
    ret
    .cfi_endproc
Run Code Online (Sandbox Code Playgroud)

  • @Miharu461(和 Björn):不要忘记标志可以来自任何东西。cmov 部分实际上只是 `eax = Greater ?edi : eax` 部分,其中 `bool Greater` 可以由任何内容设置,不一定涉及 `a` 或 `b`。所以 `a = x>=y : b : a` 仍然可以编译为 cmovge。 (3认同)