0

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

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

4

1 回答 1

1

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

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

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

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

简单的回答:

这是不可能的。

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

更复杂的答案:

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

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

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

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

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

于 2020-06-09T06:09:15.237 回答