操作码'89'的x86 Modrm/Sib/Displacement字节

ric*_*ick 6 x86 assembly disassembly

我正在为32位x86指令集开发一个反汇编程序.我的代码目前正确解码大多数1和2字节操作码,但我遇到了一个问题.当我将代码的输出与Objdump进行比较时,我发现Objdump看到以下内容: -

89 14 98                mov    %edx,(%eax,%ebx,4)

8b 45 d8                mov    -0x28(%ebp),%eax
Run Code Online (Sandbox Code Playgroud)

另一方面,我的代码给出: -

89 14 98 8B 45 D8 89   MOV.
Run Code Online (Sandbox Code Playgroud)

根据我对Intels文档(特别是Modrm和Sib寻址表格表)的理解,这个字节流应解释为: -

89 - The opcode
14 - The Modrm byte
98 - The Sib byte specified by the Modrm byte (as shown in Intels Modrm addressing table)
8B 45 D8 89 - The four byte displacement specified by the Sib byte (as shown in Intels Sib addressing table).
Run Code Online (Sandbox Code Playgroud)

Objdump说没有位移字节,但我的代码和英特尔文档都出现(至少对我来说).

如果有人能够指出我的错误在哪里,那将非常感激.

谢谢.

Ala*_*rry 4

Mod/RM 字节 0x14 分解为 Mod=00 Reg=010 R/M=100。

http://download.intel.com/design/intarch/manuals/24319101.pdf表 2-2(标记为“2-6”的页面,实际上是 PDF 的第 36 页)中显示 Mod=00 R/M=100作为没有位移的 SIB。

我无法确定您误读了哪一部分,因为您没有指定您正在使用的文档。有很多不同的英特尔手册。

  • 一旦您学会如何阅读表格,所有内容都在表格中。您已经提到的脚注解释了 mod=00 base=101 是一种特殊情况。在我使用的 pdf 中,附录 A 中的 A.2 部分是很好的解码指南。 (2认同)