Assembly 我如何获得有关组件的更详细信息? 40087e:48 8b 05 cb 01 20 00 mov 0x2001cb(%rip),%rax#600a50

Assembly 我如何获得有关组件的更详细信息? 40087e:48 8b 05 cb 01 20 00 mov 0x2001cb(%rip),%rax#600a50,assembly,Assembly,以上是objdump的输出 但是,我想知道48 8b 05 cb 01 20 00的哪个部分代表mov,0x2001cb(%rip) 也就是说,是否有工具来分解机器代码 48 8b 05 cb 01 20 00 mov 0x2001cb(%rip),%rax 48是REX前缀,通常用于指示指令操作数(寄存器或内存位置)应为64位而不是32位(即此指令中的RAX而不是EAX)。REX前缀也用于操作R8到R15寄存器的指令中 8b是MOV指令opcode。其他值用于其他指令。例如,2b表示SUB,8

以上是objdump的输出

但是,我想知道
48 8b 05 cb 01 20 00
的哪个部分代表
mov
0x2001cb(%rip)

也就是说,是否有工具来分解机器代码

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

48是
REX前缀
,通常用于指示指令操作数(寄存器或内存位置)应为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和00构成内存操作数的
disp32
部分,此位移等于
2001CBH

把这一切放在一起,我们得到了MOV-RAX,[RIP+2001CBH]

有几种方法可以解码指令:

  • 手动使用英特尔或AMD的CPU手册
  • 带有独立的反汇编程序,例如与
  • 用你最喜欢的调试器;只要将感兴趣的指令字节放在程序内存的某个地方(您可以键入它们),然后让反汇编程序向您显示该指令位置的反汇编

不要费心回答这个问题。new_perl将在他让您花时间解决他的问题后删除该问题!谢谢你,巴德!
40087e:       48 8b 05 cb 01 20 00    mov    0x2001cb(%rip),%rax        # 600a50 <__CTOR_LIST__+0x8>