我正在编写一个汇总堆栈的报告。如果你点击我的个人资料,你会看到我已经做了一段时间。现在,我有一些麻烦,因为在GDB上它向我展示了与视觉工作室不同的东西。因此,我不太了解我对基本指针和堆栈指针的理解,并且我希望如果我错了,有人能够带领我走向正确的方向。有关基址指针和堆栈指针的问题
对于x86计算机,堆栈是典型的向下增长(从较高的内存地址到较低的地址)。
所以当一个程序开始时,我们调用了main函数。
一般来说,在每个函数调用的入口,一组在当前ESP位置创建的,这就是我们所谓的“堆栈的顶部”。它是否正确?
当旧的ebp被推入堆栈时,它是否被推到了esp第一次指向的地方?
之后,esp会向下移动,指向一个空的内存位置,这是正确的吗?
最后,esp总是在变化,向下移动指向下一个可用内存空间。那是对的吗?
esp是移动每个字节还是每4个字节向下?
我知道有很多问题。但是谢谢你的时间!
谢谢你的回应,先生!
@iSciurus
我很困惑大家如何界定尤指这是压入堆栈中的最新条目指向。
对于x86,由于堆栈向下增长,从您的解释中,esp将首先指向堆栈的最低地址。当我查看汇编代码时,我们有
0x080483f4 <+0>: push %ebp
0x080483f5 <+1>: mov %esp,%ebp
0x080483f7 <+3>: sub $0x10,%esp
所以esp减少了16个字节。所以这是大小的这个函数调用的堆栈。局部变量紧接在返回地址后面(ebp-4,ebp-8等)。那么esp的总体目标是什么?据我所知,当我们试图访问比这个更小的地址时,会发生堆栈溢出。
最后一件事是:当我们说栈顶时,我们是指最低地址(对于x86)。
这是图片我心目中(向下增长)
[Parameter n ]
...
[Parameter 2 ]
[Parameter 1 ]
[Return Address ] 0x002CF744
[Previous EBP ] 0x002CF740 (current ebp)
[Local Variables ]
-- ESP
对不起,这些长期问题。但我真的很感谢你的帮助。
谢谢,先生。我仍然有一点疑问,我编辑了我的帖子。如果你有时间,你介意看看?谢谢。 – CppLearner
非常感谢。我想知道的最后一件事是,在局部变量下面,有一个传统上称为“动态内存”的区域,它尚未被任何进程占用(希望)。所以这就是我们在同一个过程中称之为“随意增加堆栈”的地方。说你正在调用“新”运营商的过程中。新的存储现在在ESP下创建。 ESP现在向下移动吗?谢谢。 – CppLearner
不,esp不会改变,因为esp与堆没有任何共同之处。 – asd