英特尔堆栈增长和参考

时间:2014-10-08 20:51:29

标签: assembly kernel intel

我对Intel IA-32堆栈有几个问题。具体做法是:

  1. 当我push一个值进入堆栈时,堆栈指针减少了推送值(%esp - size)的大小,并且该值存储在旧值{{1} }。
  2. 如果我想在没有%esp的情况下从堆栈中读取值,我需要增加堆栈指针(pop)。
  3. A piece of kernel code I have从堆栈中减去所需的大小,而不是添加它。我的假设是,当发生这种情况时,我想要的值是从指针地址移动,而不是移动
  4. 因此,任何进一步的阅读都会收集不良数据。
  5. 我的上述断言是否正确?提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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