如何获得有关装配的更多详细信息?

时间:2011-11-08 05:38:33

标签: assembly

40087e:       48 8b 05 cb 01 20 00    mov    0x2001cb(%rip),%rax        # 600a50 <__CTOR_LIST__+0x8>

以上是来自objdump的输出。

但我想知道48 8b 05 cb 01 20 00的哪一部分代表mov0x2001cb(%rip) ......

也就是说,是否有一个分解机器代码的工具?

1 个答案:

答案 0 :(得分:2)

  

48 8b 05 cb 01 20 00 mov 0x2001cb(%rip),%rax

48是REX prefix,通常用于指示指令操作数(寄存器或存储器位置)应该是64位而不是32位(即该指令中的RAX而不是EAX)。 REX前缀也用于操作R8至R15寄存器的指令。

8b是MOV指令opcode。其他值用于其他指令。例如,2b表示SUB,8d表示LEA。

05ModR/M字节,在64位模式下表示RIP+disp32内存寻址(而不是32位模式下的disp32)。这是在字节的ModR/M位字段中编码的。该字节的Reg位字段还告诉使用RAX寄存器作为另一个操作数。

cb, 01, 20 and 00构成内存操作数的disp32部分,此位移等于2001CBH

将所有内容放在一起,我们到达MOV RAX, [RIP+2001CBH]

有几种解码指令的方法:

  • 手动使用Intel或AMD的CPU手册
  • 使用独立的反汇编程序,例如:与NASM
  • 一起出现的ndisasm
  • 使用您最喜欢的调试器;只需在程序存储器中的某个地方有你感兴趣的指令的字节(你可以输入)并让反汇编程序向你显示该指令的位置的反汇编