【问题标题】:Intel Stack Growth and Reference英特尔堆栈增长和参考
【发布时间】:2014-10-09 05:24:15
【问题描述】:

我有几个关于英特尔 IA-32 堆栈的问题。具体来说:

  1. 当我将push 一个值放入堆栈时,堆栈指针会减少压入的值的大小(%esp - size),并将值存储在%esp 的旧值处。
  2. 如果我想在没有poping 的情况下从堆栈中读取值,我需要增加堆栈指针 (%esp + size)。
  3. A piece of kernel code I have 是从堆栈中减去所需的大小,而不是添加它。我的假设是,当这种情况发生时,我想要的值是从指针地址 远离,而不是 它移动。
  4. 因此,任何进一步的读取都会获取错误数据。

我的上述断言正确吗?提前致谢。

【问题讨论】:

  • 发布代码(带注释!!!),以便我们阅读并查看编译器在做什么,以及您认为您希望它做什么。

标签: assembly kernel intel


【解决方案1】:
  1. 错误,值写入新的%esp 值。
  2. 错了,因为第 1 点:您可以从 (%esp) 读回您最近的值。您需要添加到 %esp 才能访问旧项目。
  3. 该代码只是从堆栈中分配一块内存作为本地存储。该块稍后填充。
  4. 不明白你的意思。

【讨论】:

    【解决方案2】:

    根据the IA-32 specification,PUSH 减少堆栈指针,然后将值存储在新的%esp 位置。因此,在没有pop 的情况下读取推送的值将只是读取%esp 的当前值所指向的值。

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2011-03-23
      • 2011-09-18
      • 2018-02-12
      • 2011-04-04
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      相关资源
      最近更新 更多