私は次のことを理解しようとしています:
C の小さな Hello World プログラムが与えられた場合
#include <stdio.h>
int main()
{
    int i;
    for(i=0; i < 10; i++)
    {
        printf("Hello, world!\n");
    }
}
これを gcc でコンパイルし、結果の .out ファイルを objdump を使用して調べると、次のような結果が得られます。
08048374 <main>:
8048374:       55                      push   ebp
8048375:       89 e5                   mov    ebp,esp
8048377:       83 ec 08                sub    esp,0x8
804837a:       83 e4 f0                and    esp,0xfffffff0
804837d:       b8 00 00 00 00          mov    eax,0x0
8048382:       29 c4                   sub    esp,eax
8048384:       c7 45 fc 00 00 00 00    mov    DWORD PTR [ebp-4],0x0
804838b:       83 7d fc 09             cmp    DWORD PTR [ebp-4],0x9
804838f:       7e 02                   jle    8048393 <main+0x1f>
8048391:       eb 13                   jmp    80483a6 <main+0x32>
8048393:       c7 04 24 84 84 04 08    mov    DWORD PTR [esp],0x8048484
804839a:       e8 01 ff ff ff          call   80482a0 <printf@plt>
804839f:       8d 45 fc                lea    eax,[ebp-4]
80483a2:       ff 00                   inc    DWORD PTR [eax]
80483a4:       eb e5                   jmp    804838b <main+0x17>
80483a6:       c9                      leave  
80483a7:       c3                      ret    
80483a8:       90                      nop    
80483a9:       90                      nop    
80483aa:       90                      nop    
結果の .out ファイルの値の最初の列はメモリ アドレスです。私の理解が正しければ、これらのアドレスには他の列に続く命令が含まれています。
ここで私の質問: ファイルを別のマシン (または同じマシンの別の場所) にコピーし、ファイルを再度ダンプすると、プログラムはメモリ内の別の場所にあるため、これらのアドレスは別のものに変更されるはずです。正しいですか? しかし、それを行うと、まったく同じ出力、同じアドレス値が得られます。何故ですか?この最初の列の意味を明らかに誤解しています。誰か、これらのアドレスが正確に何であるかを説明してもらえますか? 前もって感謝します!
更新:私が今理解しているように、Paul R の回答とさらにウィキペディアを読んだおかげで、これらのアドレスは、コードが実行されるマシンのオペレーティング システムによってコードが実行される仮想アドレス空間を参照しています。これらの仮想アドレスは、オペレーティング システムによって実際のマシンの絶対アドレスにマップされます。