【问题标题】:Win32 assembly conditional jumpsWin32 汇编条件跳转
【发布时间】:2016-10-28 05:13:25
【问题描述】:

关于以下操作码参考:http://ref.x86asm.net/coder32.html

我试图更多地了解条件跳转。您将在上面引用的链接中看到“如果零/等于 (ZF=0) 时跳转短”的操作码是 74。因此,如果我们(在调试器中)二进制插入字节 74 04 并将 ZF 标志设置为 0,我们将看到 4 字节的短向前跳转:

0207FF9F        74 04        JE SHORT 0207FFA5

没有问题。

稍后在同一个参考中,使用操作码 85 引用了一个类似的条件短跳转,但是如果您将该代码以类似的字节长度弹出以进行条件跳转,您会得到以下内容:

0207FFA5        850441        TEST DWORD PTR DS:[ECX+EAX*2],EAX

我显然不明白这里的一些东西,有人能解释一下吗?基于标志值的条件短跳转是否仅限于操作码 707F

【问题讨论】:

  • @mazegen 在上面提到的参考文献中打错了:Jump if zero/equal 的条件实际上是 ZF=1 而不是 ZF= 0,反之亦然。

标签: assembly x86 opcode


【解决方案1】:

您找到的第二个85 在 2 字节操作码表中,其中每个条目都以 0F 为前缀。

“近”(rel32)version of JZ/JE is 0F 85。 (糟糕,HTML 提取截断了编码列表,只得到了一些 0F .. rel32 版本。或者实际上已经破坏了其余的非表格格式。请参阅英特尔的 PDF 原件。

那些操作码表不是指令集参考手册。不过,如果您只需要快速参考,它们会很方便。如果您感到困惑,请查看完整手册中的说明( 标签 wiki 中的链接。

【讨论】:

  • 谢谢彼得 - 对此进行了测试,并且 2 字节操作码在启动条件跳转方面似乎确实有效。我唯一的另一个问题是如何指定字节跳转长度?在操作码没有启动 4 字节跳转之后输入 04 - 它实际上引用了无效的内存地址(在本例中为 JE 434640A8)。我从英特尔的原始操作码文档中看到您提到引用的跳转条件是 0F 87 cd - 我还将研究 cd vs cb 这是存在于许多其他跳跃中。谢谢!
  • @SirSaucealot:0F 85 是指令的 32 位位移版本。这就是为什么有两个:用于短跳(8 位位移)和添加的 386 32 位位移版本(“近跳”,而不是也会改变 CS 的远跳)。阅读指令集参考手册条目:它解释了编码。或者在汇编器中汇编指令,看看你得到了什么。
  • 我看到 cd 在操作码之后引用了字节值,我将通过更多的阅读和测试到达那里! :)
  • @SirSaucealot:是的,这意味着 dword(而不是 byte),如 insn set ref 手册的介绍部分所述。我链接的手册条目的文本描述部分清楚地表明有 rel8、rel16(用于 16 位模式)和 rel32(用于 32 和 64 位模式)跳转。每个编码在“instruction”列中都有一个 rel32 或 rel8,编码的右侧一个。当然,通常最简单的方法是将助记符放入汇编器中然后查看结果,而不是总是使用反汇编器。
猜你喜欢
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 2015-04-08
相关资源
最近更新 更多