2011-11-08 18 views
1
40087e:  48 8b 05 cb 01 20 00 mov 0x2001cb(%rip),%rax  # 600a50 <__CTOR_LIST__+0x8> 

上記はobjdumpの出力です。アセンブリの詳細情報はどのように入手できますか?

私はmov0x2001cb(%rip)を表し48 8b 05 cb 01 20 00のどの部分を知りたい...しかし

され、マシンコードを打破するためのツールですが?

+0

この質問に答えることはできません。 new_perlは、問題に時間を費やすようになった後で質問を削除します。ありがとう、芽! – dontGoPlastic

答えて

2

48 8B 05、CB 01 20 00 MOVの0x2001cb(%のRIP)は、%RAX

48は、典型的には、その命令のオペランド(レジスタまたはメモリ位置)を示すために使用さREX prefixで64なければなりません代わりに32ビット(この命令ではEAXの代わりにRAX)を使用します。 REX接頭辞は、R8〜R15レジスタを操作する命令でも使用されます。

8bは、MOV命令opcodeです。その他の値には他の値が使用されます。例えば、2bはSUBを意味し、8dはLEAを意味する。

05は、64ビット・モードで(だけでなくdisp32 32ビットモードでの)アドレッシングRIP+disp32メモリ、ModR/Mバイトです。これは、バイトのModR/Mのビットフィールドにエンコードされています。このバイトのRegビットフィールドは、他のオペランドにRAXレジスタを使用するようにさらに指示します。

cb, 01, 20 and 00メモリオペランドのdisp32部分を形成します。この変位は2001CBHに等しくなります。

すべて一緒に置くとMOV RAX, [RIP+2001CBH]に到着します。

命令をデコードするには、いくつかの方法があります。

  • は、例えば、スタンドアロン逆アセンブラでのIntelまたはAMD
  • からCPUのマニュアルを用いて手でndisasmは、あなたの好きなデバッガでNASM
  • と一緒に来ます。問題の命令のバイトをプログラムのメモリのどこかに置いて(あなたはそれらを入力することができます)、逆アセンブラにその命令の場所の逆アセンブリを表示するよう依頼してください。
関連する問題