如何反汇编movb指令

kar*_*osu 6 x86 assembly objdump disassembly i386

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

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

c6 05 14 a0 04 08 01    movb   $0x1,0x804a014
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Sco*_*ski 5

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之后的字节)对应于00 000 101的r / m字节(二进制)。
  4. r / m字节的“后三个”(位0-2)对应于r / m字段。r / m值为101(5)表示“使用位移双字”,因此mod / rm字节后面的下4个字节形成立即数地址。
  5. 14 a0 04 08是0x0804a014的小尾数编码
  6. 最后一个字节1是立即加载到地址中的值

我希望这有帮助。