如何找出堆栈的开始和结束的地址?
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 需要知道堆栈的“已使用”和“未使用”部分之间的“边界”以执行堆栈操作(push
、pop
、call
、ret
...) .
因此,CPU 的堆栈指针寄存器 (SP
) 包含了这个“边界”的位置。
这个“边界”的地址是CPU唯一需要的信息;它不需要任何其他类型的信息,例如堆栈的大小、开始或结束,即可执行任何类型的操作。
由于不需要此信息,CPU 没有任何包含此信息的寄存器或类似物。
因此,您无法使用汇编读取此信息。
【讨论】:
以上是关于如何找出堆栈的开始和结束的地址?的主要内容,如果未能解决你的问题,请参考以下文章
Cortex M3映射从0x00000000地址开始,0地址不是堆栈指针吗?能从这开始执行吗?