assembly - 操作码 '89' 的 x86 Modrm/Sib/位移字节

标签 assembly x86 disassembly

我正在为 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.

根据我对英特尔文档(特别是 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 说没有位移字节,但我的代码和英特尔文档似乎(至少对我而言)另有说法。

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

谢谢。

最佳答案

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。

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

关于assembly - 操作码 '89' 的 x86 Modrm/Sib/位移字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12045467/

相关文章:

assembly - INT13H(非扩展)是否能够访问每个柱面超过 16 个磁头的驱动器?

assembly - 8086中段寄存器的值是多少?

python - 为什么类定义总是产生相同的字节码?

assembly - 像 .size X,.-X 这样的代码模式有什么作用?

c - 是否可以在 C 中创建 pow(double a, double b) 函数而无需汇编?

assembly - .fill .long 在汇编中意味着多少字节?

c++ - %ld 格式转换以实现便携性

c++ - 如何在 x86 程序集中调用函数并向其传递参数

c - C 中的按位移位问题

c++ - 手动反编译引用