Memory management 关于基指针和堆栈指针的问题
我正在写一份报告来总结一下。如果你点击我的个人资料,你会看到我已经这样做了一段时间。现在,我遇到了一些麻烦,因为在GDB上它向我展示了与VisualStudio不同的东西 因此,我不太确定我对基指针和堆栈指针的理解,如果我错了,我希望有人能把我引向正确的方向 对于x86计算机,堆栈通常向下增长(从较高的内存地址到较低的内存地址) 因此,当程序开始时,我们调用main函数Memory management 关于基指针和堆栈指针的问题,memory-management,pointers,stack,base,Memory Management,Pointers,Stack,Base,我正在写一份报告来总结一下。如果你点击我的个人资料,你会看到我已经这样做了一段时间。现在,我遇到了一些麻烦,因为在GDB上它向我展示了与VisualStudio不同的东西 因此,我不太确定我对基指针和堆栈指针的理解,如果我错了,我希望有人能把我引向正确的方向 对于x86计算机,堆栈通常向下增长(从较高的内存地址到较低的内存地址) 因此,当程序开始时,我们调用main函数 通常,在每个函数调用的入口,都会在当前esp位置创建一个堆栈,这就是我们所说的“堆栈顶部”。这是正确的吗 当旧ebp被推到堆栈
谢谢您的回复,先生 @伊斯库罗斯 我对每个人如何定义esp感到困惑,因为esp指向的是推送到堆栈上的最新条目 对于x86,由于堆栈向下增长,根据您的解释,esp将首先指向堆栈的最低地址。当我看汇编代码时,我们有
0x080483f4 <+0>: push %ebp
0x080483f5 <+1>: mov %esp,%ebp
0x080483f7 <+3>: sub $0x10,%esp
很抱歉问了这么长的问题。但我真的很感谢你的帮助
esp的总体用途几乎总是一样的:存储堆栈的顶部。所有与堆栈相关的指令(如pop/push)都使用esp作为参数。在x86中,ebp和esp都用于存储有关堆栈帧的信息(对应于底部和顶部)。也许,你对这种冗余感到困惑。然而,在x64中,只有rsp用于基于堆栈的参数,rbp是一个通用寄存器 堆栈中的缓冲区溢出又如何呢?当代码试图写入高于数组最后一个元素(或struct或其他任何元素)的内容时,通常会发生缓冲区溢出。堆栈向下增长,但数组向上增长。当我们写得更高时,我们可以访问返回地址、SEH处理程序以及调用者的内部变量 是的,当我们说顶部时,我们指的是最低的地址。因此,大多数调试器以相反的顺序显示堆栈:
-- ESP
[Local Variables ]
[Previous EBP ] 0x002CF740 (current ebp)
[Return Address ] 0x002CF744
[Parameter 1 ]
[Parameter 2 ]
...
[Parameter n ]
这里,ESP指向“高于”所有数据的值,看起来更像“顶部”。虽然它仍然是使用率最低的地址
esp的总体用途几乎总是一样的:存储堆栈的顶部。所有与堆栈相关的指令(如pop/push)都使用esp作为参数。在x86中,ebp和esp都用于存储有关堆栈帧的信息(对应于底部和顶部)。也许,你对这种冗余感到困惑。然而,在x64中,只有rsp用于基于堆栈的参数,rbp是一个通用寄存器 堆栈中的缓冲区溢出又如何呢?当代码试图写入高于数组最后一个元素(或struct或其他任何元素)的内容时,通常会发生缓冲区溢出。堆栈向下增长,但数组向上增长。当我们写得更高时,我们可以访问返回地址、SEH处理程序以及调用者的内部变量 是的,当我们说顶部时,我们指的是最低的地址。因此,大多数调试器以相反的顺序显示堆栈:
-- ESP
[Local Variables ]
[Previous EBP ] 0x002CF740 (current ebp)
[Return Address ] 0x002CF744
[Parameter 1 ]
[Parameter 2 ]
...
[Parameter n ]
这里,ESP指向“高于”所有数据的值,看起来更像“顶部”。尽管它仍然是使用率最低的地址。谢谢您,先生。我仍然有点怀疑,我编辑了我的帖子。如果你有时间,你介意看一看吗?谢谢,非常感谢。拉斯维加斯