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
部分代表mov
,0x2001cb(%rip)
...
也就是说,有没有打破机器代码的工具吗?
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)
...
也就是说,有没有打破机器代码的工具吗?
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
存储器寻址(而不是只在disp32
32位模式)。这在字节的Mod
和R/M
位字段中编码。该字节的Reg
位字段还指示将RAX寄存器用于其他操作数。
cb, 01, 20 and 00
构成内存操作数的disp32
部分,此位移等于2001CBH
。我们到达MOV RAX, [RIP+2001CBH]
。
有几种方法的指令进行解码:
ndisasm
与NASM
不要麻烦回答这个问题。 new_perl会在你让他花费时间解决他的问题之后删除问题!谢谢,萌芽! – dontGoPlastic