每当我在我的程序(32位,red hat linux)上使用gdb时,我发现寄存器中使用的地址与链接到机器指令的地址相差甚远。
使用简单的" hello world program"
0x080483a4 <main+0>: lea 0x4(%esp),%ecx
0x080483a8 <main+4>: and $0xfffffff0,%esp
0x080483ab <main+7>: pushl -0x4(%ecx)
....
info寄存器命令产生
esp 0xffffb970 0xffffb970
ebp 0xffffb978 0xffffb978
esi 0x9d5ca0 10312864
edi 0x0 0
eip 0x80483b5 0x80483b5 <main+17>
那些esp和ebp显示的帧与代码所在的位置非常不同。
我认为是......
在4gb ram棒中,有2 ^ 32个内存位置,堆栈位于顶部(它的位置为0xFFFFFFFF)并向下扩展,类似这些hello程序,操作系统本身,其他当前运行的程序位于底部并且长大(因此它从0x00000000开始),就在堆的正下方,堆也位于堆栈所在的另一侧。
我可能错了,但我希望得到你们的回答。
此外,还有更多关于内存其余部分的信息吗?是否有一门课程/书籍涵盖与我刚才提出的类似的广泛问题?我觉得我必须在我的简介汇编语言课中填写很多空白。
谢谢。
答案 0 :(得分:4)
除非您有时间机器并且回到1960年代,否则您看到的所有地址都是虚拟地址。它们可能在物理内存中彼此靠近,但仍有一个地址高,另一个低。如果您的操作系统正在分配4K页面,则硬件不会映射低12位地址位。