【问题标题】: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 位堆栈指针。

标签: assembly x86 callstack stack-size


【解决方案1】:

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

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

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

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

简单回答:

这是不可能的。

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

更复杂的答案:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-09-23
    • 2014-06-08
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多