我想了解以下信息:编译的C程序存储器地址
考虑用C
#include <stdio.h>
int main()
{
int i;
for(i=0; i < 10; i++)
{
printf("Hello, world!\n");
}
}
小Hello World程序当你用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 <[email protected]>
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文件生成的第一列中的内存地址,如果我理解正确的话,这些地址续ain其他栏中的说明。
现在我的问题:如果您将文件复制到另一台计算机(甚至是同一台计算机上的不同位置)并再次转储文件,这些地址应该更改为其他位置,因为程序将位于不同的位置记忆,正确?但如果我这样做,我会得到完全相同的输出,相同的地址值。这是为什么?我明显误解了这第一列的含义,有人请向我解释这些地址究竟是什么?提前致谢!
更新: 现在我明白了,得益于Paul R的回答以及更多维基百科的阅读,这些地址引用了一个虚拟地址空间,其中的代码由运行它的机器的操作系统执行。这些虚拟地址通过操作系统映射到实际机器上的绝对地址。
我想你误解了内存和磁盘的概念。该地址是_memory_中的地址(也称为RAM,以保持简单),而_disk_中不使用这些地址。我建议你多了解一下计算机的基本架构,比如磁盘和内存之间的区别。 – 2012-08-09 11:01:54
“这些地址应该更改为其他内容,因为程序将位于内存中的不同位置,对吗?” - 你没有处理内存中的程序,你正在处理一个目标文件,最终将被加载到内存中。 – 2012-08-09 11:21:20
我明白内存和磁盘之间的区别,我的困惑来自于不知道这些地址是虚拟的 – Asciiom 2012-08-09 11:46:18