0

最終的な実行可能ファイルにリンクされた次のアセンブリ コードがあります。

section .text
global _start

_start: mov eax, 4
        mov ebx, 1
        mov ecx, mesg
        mov edx, 9
        int 0x80
mesg    db      "Kingkong",0xa

私が次にしたことは、その16進コードを取得することでした 0xb8,0x04,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0xb9,0x76,0x80,0x04,0x08,0xba,0x09,0x00,0x00,0x00,0xcd,0x80,0x4b,0x69,0x6e,0x67,0x6b,0x6f,0x6e,0x67,0x0a

以下のような別のプログラムに配置します

section .text
global _start
_start:
        db 0xb8,0x04,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0xb9,0x76,0x80,0x04,0x08,0xba,0x09,0x00,0x00,0x00,0xcd,0x80,0x4b,0x69,0x6e,0x67,0x6b,0x6f,0x6e,0x67,0x0a

上記のファイルをアセンブルしobjdumpてそれを乗り越えると、

08048060 <_start>:
 8048060:       b8 04 00 00 00          mov    $0x4,%eax
 8048065:       bb 01 00 00 00          mov    $0x1,%ebx
 804806a:       b9 76 80 04 08          mov    $0x8048076,%ecx
 804806f:       ba 09 00 00 00          mov    $0x9,%edx
 8048074:       cd 80                   int    $0x80
 8048076:       4b                      dec    %ebx
 8048077:       69 6e 67 6b 6f 6e 67    imul   $0x676e6f6b,0x67(%esi),%ebp
 804807e:       0a                      .byte 0xa

mesgラベルが最終ダンプに表示されない場合、プログラムは上記のプログラムでセグメントのアドレスをどのように把握するのでしょmesgうか?

編集: 答えを読んだ後、これに小さな質問を追加したいと思います。実際のアドレス指定にはラベルが使用されていないことを理解できますが、アドレスはコードに直接組み込まれています。ただし、アドレスがmov $0x8048076,%ecx保証のように指定されている場合次回プログラムが読み込まれると、正確に同じアドレスから開始されます...このコードを C でラップするとどうなりますか? メモリ パターンがまったく異なる別のマシンで実行したい場合はどうすればよいですか。

4

2 に答える 2

4

ラベルはオフセット/アドレスに変換されます。デバッグ用にその情報を明示的に保存しない限り、実際のラベルは表示されません。

この線:

mov    $0x8048076, %ecx

これはmesgアドレス0x8048076であり、文字列の先頭でもありますKingkong

mesgと呼ばれるものがあることさえ知らないため、プログラムは の値が何であるかを「把握」する必要はありませんmesg。表示されるのはアドレスだけです。これで問題ありません。必要なのはそれだけだからです。

名前付きラベルを使用すると便利で、読みやすくなります。それらは、ラベルの値を実際のアドレスまたはオフセットに変換するという意味で、アセンブラとリンカにとってのみ重要です。また、デバッグ情報を保存するようにアセンブラまたはリンカに指示する場合は、デバッガで使用して、コードのデバッグを支援することもできます。

2 番目の質問に対処するには:

持っているアドレスは仮想メモリ アドレスです (つまり、物理メモリ アドレスではありません)。これが意味することは、OS が実行時に正しい場所 (つまり、物理メモリ内) にマップするため、実行可能ファイルが実際にどの物理アドレスにあるかを知る必要がないということです。これが、実行可能ファイルを別のマシンで実行した場合 (実行可能ファイルがその OS 用にコンパイルされている場合)、または繰り返し実行した場合に、実行可能ファイルが機能する理由です。OS は、その仮想アドレスを物理メモリにマッピングします。

詳細については、こちらこちらをご覧ください。

于 2013-08-06T17:43:50.477 に答える