x86 Modrm/Sib/位移字节,用于操作码'89'



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

89 14 98                mov    %edx,(%eax,%ebx,4)
8b 45 d8                mov    -0x28(%ebp),%eax

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

89 14 98 8B 45 D8 89   MOV.

根据我对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).

Objdump说没有位移字节,但我的代码和Intels文档(至少对我来说)似乎都不是这样。

如果有人能指出我的错误在哪里,我将不胜感激。

谢谢。

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。

我不能确定你误读了哪一部分,因为你没有具体说明你使用的文档。有很多不同的英特尔手册。

最新更新