5

我从objdump -dx86 linux 程序的反汇编中得到以下行...

4000b0: ba 0e 00 00 00          mov $0xe,%edx

我试图了解机器代码“ba 0e 00 00 00”如何映射到“mov $0xe,%edx”

在手动移动立即 32 位是:

B8 + rd  ... MOV r32, imm32

即“B8”而不是“BA”

事实上,没有一个 MOV 操作码是“BA”。

如果有人可以分解“ba 0e 00 00 00”并逐位解释如何获得“mov $0xe,%edx”,那将是最有帮助的。

4

1 回答 1

12

操作码 0xba 是“MOV EDX, imm32”。混乱来自 IA 手册在呈现指令编码时采取了太多捷径,即使对于像 0xba 这样的短单字节操作码也是如此。

在 IA 手册中,您会看到:

B8+ rd MOV r32, imm32 OI 有效 有效 将 imm32 移动到 r32。

这意味着取 0xb8 并添加特定 r32 的编码以获得最终的操作码字节。

具体的 r32 编码在第 2A 卷的表 2-2 中。

EAX 000 = 0
 ECX 001 = 1
 EDX 010 = 2
 EBX 011 = 3
 ESP 100 = 4
 EBP 101 = 5
 ESI 110 = 6
 EDI 111 = 7

英特尔参考资料第 2C 卷中的附录 A 在这些情况下也有帮助。本附录提供 1、2 和 3 字节指令的操作码映射。在您的情况下,在那里查找单字节操作码 0xBA 表示该指令是立即进入寄存器 rDX 的 MOV,其中宽度“r”取决于其他因素。

于 2012-06-21T03:00:42.773 回答