40087e: 48 8b 05 cb 01 20 00 mov 0x2001cb(%rip),%rax # 600a50 <__CTOR_LIST__+0x8>
以上是来自objdump的输出。
但我想知道48 8b 05 cb 01 20 00
的哪一部分代表mov
,0x2001cb(%rip)
......
也就是说,是否有一个分解机器代码的工具?
答案 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。
05
是ModR/M
字节,在64位模式下表示RIP+disp32
内存寻址(而不是32位模式下的disp32
)。这是在字节的Mod
和R/M
位字段中编码的。该字节的Reg
位字段还告诉使用RAX寄存器作为另一个操作数。
cb, 01, 20 and 00
构成内存操作数的disp32
部分,此位移等于2001CBH
。
将所有内容放在一起,我们到达MOV RAX, [RIP+2001CBH]
。
有几种解码指令的方法:
ndisasm