2016-08-19 9 views
0

ラベルの住所を取得するにはどうすればよいですか?フラットアセンブラ:ラベルのアドレスを取得するにはどうすればよいですか?

私は余分なコードに

例追加することなく、フラットアセンブラでのラベルのアドレスを取得したい:私は、コンソール画面に住所を印刷することができますがそれはプログラムの開発にサイズを追加し、

label1: ;is at adress 0 
db 1h,2h,3h,4h,5h ;some data 

label2: ;is at adress 5 because label1 has 5 bytes of data 

を結果を変更します。

私はラベルだけを使用していますが、生のアドレス番号が必要です。

+0

デバッガを使用しますか、シンボルテーブルからアドレスを取得するための 'objdump 'のようなものです。ラベルアドレスは、ジャンプターゲット、ロード/ストアアドレス、即値オペランド、またはデータ(例えば、 '.dd label2')として使用しないと、シンボルテーブルの外のどこにも格納されません。 –

+0

'label1'と' label2'の間に5バイトのデータがあると言う方がより正確でしょう;ラベルは関連するサイズを持っていません。 MASMまたはTASMを使用しています。ここでdb/dw/ddはラベルの後にメモリオペランドでそのラベルを使用する命令のオペランドサイズを魔法のように暗示しています) –

+0

とにかく、明確にするために、 –

答えて

1

クイックソリューション:

私はちょうどアセンブリファイルの最後にすべてのシンボルを配置し、バイナリエディタでそれを見て:

例:

label1: ;example label (can be anywhere) 
;... 
;... My Programm 
;... 

;the end of the program 
db 0h ;just some spacer 
dw label1 
+0

これはうまく動作し、前のコードのレイアウトを妨げてはいけません。 FASMにALIGNディレクティブがあると、アドレスのブロックを見つけやすくなり、16進数のダンプ出力の行の始めに整列させることができます。おそらく私の答えから、私はFASMについて何も知らず、主にLinux上でNASM/YASMを使うと言うことができます。 –

0

デバッグシンボルでプログラムをビルドすると、オブジェクトファイル内のシンボルテーブル(メタデータ)にすべてのラベルのアドレスが含まれます。

次に、objdump -tを使用して、実行可能ファイルのシンボルテーブル、または同じことをする他のプログラムをダンプできます。


シンボルテーブル以外のラベルアドレスは、命令に埋め込まれたバイナリになります。アドレス指定モード、即値オペランド、またはデータ(例えば、.dd label2)のための絶対アドレス指定モードで使用される。通常のジャンプでは相対エンコーディングが使用されるため、ジャンプのための命令エンコーディングでは絶対シンボルアドレスは見つかりません。

TL:DR:絶対アドレスを見つけるためにバイナリを逆アセンブルすることは可能ですが、その方法で使用されているラベルに対してのみ可能です。そのため、シンボルテーブルは便利です。


(ブートセクタのような)フラットバイナリをアセンブルしている場合は、ファイル形式のシンボルテーブルがありません。したがって、コマンドラインオプションを使用してFASMのシンボル情報を表示することに依存しています。私はグーグルで、.fasシンボル情報デバッグ出力ファイルを書くためにthere's a -s optionが見つかりました。

+1

FASMがデバッグシンボルをサポートしていて、残念なことに '.fas'ファイルが人間が読めるものではないかどうかはわかりません。 –

関連する問題