【发布时间】:2011-12-09 01:58:01
【问题描述】:
我正在写一份报告来总结堆栈。如果您单击我的个人资料,您会看到我已经这样做了一段时间。现在,我遇到了一些麻烦,因为在 GDB 上它向我展示了与在 Visual Studio 上不同的东西。
因此,我不太确定自己对基指针和堆栈指针的理解,如果我错了,我希望有人能引导我走向正确的方向。
对于 x86 计算机,堆栈通常是向下增长的(从较高的内存地址到较低的内存地址)。
所以当一个程序开始时,我们调用了 main 函数。
一般来说,在每次函数调用的入口处,都会在当前esp位置创建一个栈,也就是我们所说的“栈顶”。这是正确的吗?
当旧的 ebp 被压入堆栈时,它是否被压入了 esp 最初指向的位置?
之后,esp 会向下移动,指向一个空的内存位置,对吗?
最后,esp 总是在变化,向下移动指向下一个可用内存空间。对吗?
esp 是每字节向下移动,还是每 4 字节向下移动?
我知道有很多问题。但是感谢您的宝贵时间!
谢谢您的回复,先生!
@iSciurus
我很困惑每个人如何定义 esp 指向最近被压入堆栈的条目。
对于 x86,由于堆栈向下增长,根据您的解释,esp 将首先指向堆栈的最低地址。当我查看汇编代码时,我们有
0x080483f4 <+0>: push %ebp
0x080483f5 <+1>: mov %esp,%ebp
0x080483f7 <+3>: sub $0x10,%esp
所以 esp 减少了 16 个字节。所以这是这个函数调用的堆栈的size。局部变量紧跟在返回地址之后(ebp-4、ebp-8 等)。那么这里 esp 的总体目的是什么?据我了解,当我们尝试访问小于该地址的地址时,会发生堆栈溢出。
最后一件事是:当我们说栈顶时,我们指的是最低地址吗(对于 x86)。
这是我心目中的画面(向下生长)
[Parameter n ]
...
[Parameter 2 ]
[Parameter 1 ]
[Return Address ] 0x002CF744
[Previous EBP ] 0x002CF740 (current ebp)
[Local Variables ]
-- ESP
很抱歉这些冗长的问题。但我真的很感谢你的帮助。
【问题讨论】:
标签: memory-management pointers stack base