3

我相信在 x86 中实现跳转的标准方法是与以下内容进行比较:

cmpl %ebx, %eax

它将结果存储在 eflags 寄存器中,然后以下跳转命令使用该 eflags 寄存器:

je some_label

但是如果我想保存比较的结果以便以后进行跳转怎么办?我想过做类似的事情:

    cmpl %eax, %ebx
    je storetrue
storefalse:
    pushl $0
    jmp done
storetrue:
    pushl $1
done:
    ...

我需要这样做还是有更直接的方法不需要额外的跳跃?

4

1 回答 1

4

想到了几个方法。

  1. 正如问题评论中已经提到的,您可以使用条件移动指令。
  2. 您可以使用 SETxx 指令将 8 位寄存器之一设置为 0 或 1。
  3. 您可以使用 PUSHF 指令将 EFLAGS 寄存器的副本保存到堆栈中。可以使用 POPF 指令恢复。
  4. 您可以精心设计您的代码,以便下次您希望使用该比较的结果时,它不会使用修改 EFLAGS 寄存器的指令。
  5. 根据您的用例,您可以制作一个简单的算术表达式,该表达式将导致 0 或 1 或其他一些所需的值(我个人更喜欢 0 或 -1 的组合,因为然后将其转换为任何X 或 Y 对使用 AND 后跟 ADD)。

希望这可以帮助。

于 2013-08-08T12:24:40.597 回答