2011-11-08 154 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
  • 一起使用您最喜愛的調試器;只需要在程序存儲器某處(你可以輸入)感興趣的指令字節,並要求反彙編器顯示該指令位置的反彙編。
相關問題