我需要使用程序集插入来获取堆栈的开始和结束地址。据我了解,SP寄存器指向堆栈的开头,但是我如何找到结尾呢?我说的是 i386 架构。我意识到SP是栈顶,BP是栈底。所以我可以使用 BP-SP 计算大小?
还有一个问题。堆栈大小是静态的吗?启动后没有变化?
我需要使用程序集插入来获取堆栈的开始和结束地址。据我了解,SP寄存器指向堆栈的开头,但是我如何找到结尾呢?我说的是 i386 架构。我意识到SP是栈顶,BP是栈底。所以我可以使用 BP-SP 计算大小?
还有一个问题。堆栈大小是静态的吗?启动后没有变化?
据我了解,SP寄存器指向堆栈的开头......
不。正如 Jester 已经写的那样,SP
指向堆栈的“已使用”和“未使用”部分之间的“边界”。
如果SP
包含值 0x1234,则内存地址 < 0x1234 未被使用,内存地址 >= 0x1234 被使用。
我需要使用程序集插入来获取堆栈的开始和结束地址。
简单的回答:
这是不可能的。
也许操作系统提供了这样的功能 - 取决于您使用的操作系统。
更复杂的答案:
CPU 需要知道堆栈的“已使用”和“未使用”部分之间的“边界”以执行堆栈操作(push
, pop
, call
, ret
...)。
SP
因此,CPU 拥有包含这个“边界”位置的堆栈指针寄存器 ( )。
这个“边界”的地址是CPU唯一需要的信息;它不需要任何其他类型的信息,例如堆栈的大小、开始或结束,来执行任何类型的操作。
由于不需要此信息,CPU 没有任何包含此信息的寄存器或类似信息。
因此,您无法使用汇编读取此信息。