如何反汇编movb指令

时间:2012-09-11 06:07:17

标签: assembly x86 disassembly objdump i386

我正在编写一个反汇编程序,我正在查看指令格式(并手动进行一些反汇编),然后我遇到了一条似乎无法解码的指令。

该特定指令的输出(来自objdump)是:

c6 05 14 a0 04 08 01    movb   $0x1,0x804a014

但是,我不明白指令是如何解码的,因为操作码c6应该是MOV Eb Ib(Mod R / M到imm8)。

有人可以告诉我它是如何被解码的吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

这可以通过Alex Frunze的答案(部分)解释,但他有点简洁,所以我将在这里提供一些解释:

  1. 操作码为c6 / 0,表示该指令有2个操作数。一个是r / m 8,这意味着以mod / rm字节编码的操作数和一个立即操作数。两个操作数都是8位宽。
  2. 操作码中的/ 0表示操作码的一部分以mod / rm字节编码。 mod / rm字节中的第3-5位是操作码的一部分。如果c6后跟一个mod / rm字节,其位3-5的值为0,则会得到一个mov操作码。
  3. 值5(即时跟随c6的字节)对应于r / m字节00 000 101(二进制)。
  4. r / m字节的“最后三个”(位0-2)对应于r / m字段。 r / m值为101(5)表示“使用置换双字”,因此mod / rm字节后面的后4个字节构成一个立即地址。
  5. 14 a0 04 08是0x0804a014
  6. 的小端编码
  7. 最后一个字节1是加载到地址
  8. 的立即值

    我希望这会有所帮助。

答案 1 :(得分:3)

好吧,立即将移动到并不意味着什么。该指令的作用是将常数1移入位于0x804a014的存储器字节。类似于等效的C代码:

*(unsigned char *)0x804a014 = 1;

你知道,你有操作码c6。您可以将其作为Volume 2A of the docsMOV指令的一部分进行查找。

05是ModR / M字节。您可以使用Table 2-2 of volume 2A,“使用ModR / M字节的32位寻址表”来解密。在图表的“ModR / M字节值(以十六进制表示)”部分中查找05。从那里开始跟踪,你会看到这个ModR / M值的有效地址以'disp32'形式给出。那里的脚注说“disp32命名法表示跟随ModR / M字节的32位位移”。在这种情况下,这是指令的下四个字节:14 a0 04 08

最后,你有8位立即01,完整的指令被解码。

答案 2 :(得分:3)

c6 - 操作码(Mod / RM字节中还有一部分操作码,在/ digit(reg)字段中)
05 - Mod / RM字节(mod = 00b,r / m = 101b,/ digit(reg)= 0 - 操作码的一部分)
14 a0 04 08 - disp32
01 - imm8

movIbEb。您可能会混淆AT& T语法,其中objdump显示反汇编,以及Intel / AMD文档。 AT& T语法中的操作数顺序与x86 CPU手册中的顺序相反。