Assembly 我如何获得有关组件的更详细信息? 40087e:48 8b 05 cb 01 20 00 mov 0x2001cb(%rip),%rax#600a50
以上是objdump的输出 但是,我想知道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
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手册
- 带有独立的反汇编程序,例如与
- 用你最喜欢的调试器;只要将感兴趣的指令字节放在程序内存的某个地方(您可以键入它们),然后让反汇编程序向您显示该指令位置的反汇编
40087e: 48 8b 05 cb 01 20 00 mov 0x2001cb(%rip),%rax # 600a50 <__CTOR_LIST__+0x8>