2011-11-08 41 views
1
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) ...

也就是说,有没有打破机器代码的工具吗?

+0

不要麻烦回答这个问题。 new_perl会在你让他花费时间解决他的问题之后删除问题!谢谢,萌芽! – dontGoPlastic

回答

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存储器寻址(而不是只在disp32 32位模式)。这在字节的ModR/M位字段中编码。该字节的Reg位字段还指示将RAX寄存器用于其他操作数。

cb, 01, 20 and 00构成内存操作数的disp32部分,此位移等于2001CBH。我们到达MOV RAX, [RIP+2001CBH]

有几种方法的指令进行解码:

  • 用手使用来自Intel或AMD
  • 的CPU手册使用独立反汇编器,例如ndisasmNASM
  • 一起使用您最喜爱的调试器;只需要在程序存储器某处(你可以输入)感兴趣的指令字节,并要求反汇编器显示该指令位置的反汇编。
相关问题