如何找出堆栈的开始和结束的地址?

Posted

技术标签:

【中文标题】如何找出堆栈的开始和结束的地址?【英文标题】:How do I find out the address of the beginning and end of the stack? 【发布时间】:2020-09-27 19:25:17 【问题描述】:

我需要使用程序集插入来获取堆栈的开始和结束地址。 据我了解,SP寄存器指向堆栈的开头,但是如何找到结尾呢? 我说的是 i386 架构。 我意识到SP是栈顶,BP是栈底。 那么我可以使用 BP-SP 计算大小吗?

还有一个问题。堆栈大小是静态的吗?启动后没有变化?

【问题讨论】:

SP 指向当前栈顶。它可能是也可能不是你想要的。另一端取决于您忘记指定的操作系统。你也没有提到建筑。 BP 是当前堆栈帧的底部(-ish),如果它已设置的话。它又可能是也可能不是你想要的。不清楚。 您知道那些是 16 位寄存器名称,对吧? ESP 是 32 位堆栈指针。 【参考方案1】:

据我了解,SP寄存器指向堆栈的开头...

没有。正如 Jester 已经写的那样,SP 指向堆栈的“已使用”和“未使用”部分之间的“边界”。

如果 SP 包含值 0x1234,则未使用 = 0x1234 的内存地址。

我需要使用程序集插入来获取堆栈的开始和结束地址。

简单回答:

这是不可能的。

也许操作系统提供了这样的功能 - 取决于您使用的操作系统。

更复杂的答案:

CPU 需要知道堆栈的“已使用”和“未使用”部分之间的“边界”以执行堆栈操作(pushpopcallret ...) .

因此,CPU 的堆栈指针寄存器 (SP) 包含了这个“边界”的位置。

这个“边界”的地址是CPU唯一需要的信息;它不需要任何其他类型的信息,例如堆栈的大小、开始或结束,即可执行任何类型的操作。

由于不需要此信息,CPU 没有任何包含此信息的寄存器或类似物。

因此,您无法使用汇编读取此信息。

【讨论】:

以上是关于如何找出堆栈的开始和结束的地址?的主要内容,如果未能解决你的问题,请参考以下文章

堆栈与ESP(栈指针寄存器)

如何使用算术和掩码舍入地址?

我可以在 C/C++ 中获得堆栈的限制吗?

Cortex M3映射从0x00000000地址开始,0地址不是堆栈指针吗?能从这开始执行吗?

如何找出给定日期和开始和结束时间可用的所有持续时间:java

如何在代码本身中找出闪存的大小?