我正在为32位x86指令集开发一个反汇编程序。我的代码目前正确解码大多数1和2字节操作码,但我遇到了一个问题。当我将代码的输出与Objdump进行比较时,我发现Objdump看到以下内容: -
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说没有位移字节,但我的代码和英特尔文档都出现(至少对我来说)。
如果有人能够指出我的错误在哪里,那将非常感激。
感谢。
答案 0 :(得分: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。
由于您没有指定您正在使用的文档,我无法确定您误读了哪个部分。有许多不同的英特尔手册。