【问题标题】:what exactly is program stack's growth direction?程序栈的增长方向究竟是什么?
【发布时间】:2013-12-08 11:23:17
【问题描述】:

我正在阅读 Richard Blum 的 Professional Assembly Language,我对书中的不一致感到困惑,我想知道程序堆栈的增长方向到底是什么? 这是第312页的图片,这表明程序堆栈长大了。

但是当我到达第 322 页时,我看到另一个版本,这表明程序堆栈变小了。

还有这个

【问题讨论】:

  • 我说的是两个版本的书不一致。
  • 由于绘制堆栈有两种约定,所以上下术语有点误导。但是在任何体系结构中找出最简单的方法是使用 -O0 编译一个简单的函数并检查创建堆栈帧的指令是什么。在我使用的当前系统中,它是sub r1, #xxx;因此堆栈增长到较小的地址。另一种是从ISA手册中找到“push x”的解释。
  • 相关:stackoverflow.com/questions/14296088/…(对于 x86-64,替换 rsp->esp, 8 -> 4)。
  • 要确定堆栈的增长方式,请比较“push”指令前后的堆栈指针。

标签: linux assembly linux-kernel x86 stack


【解决方案1】:

这本书没有前后矛盾;每张图都在顶部显示更高的地址。

第一张图展示了一个向下增长的堆栈。调用者将参数压入堆栈,然后调用新函数。调用的行为将返回地址压入堆栈。然后被调用者将基指针的当前值压入堆栈,将堆栈指针复制到基指针中,并递减堆栈指针以为被调用者的局部变量腾出空间。

【讨论】:

  • 并且在这种情况下,函数参数是从右向左推送的; C 这样做是为了支持具有可变数量参数的函数,例如 printf
【解决方案2】:

一些背景:

对于不同的处理器,堆栈指针的含义和堆栈的方向可能不同。对于 TMS Piccolo 控制器,堆栈正在增长,因此“PUSH”将增加堆栈指针。堆栈指针可能指向上一次推送的值或写入下一个要推送的值的位置。 ARM 处理器允许堆栈的所有 4 种可能组合,因此必须有关于如何使用堆栈指针的约定。

在 x86 处理器上:

在 x86 处理器上,堆栈总是向下增长,因此“PUSH”指令将递减堆栈指针;堆栈指针总是指向最后压入的值。

第一张图显示堆栈指针(地址>堆栈指针)之后的地址已经包含值。如果您将更多值存储到堆栈中,它们将存储到堆栈指针下方的位置(下一个值将存储到地址 -16(%ebp))。这意味着第 312 页的图片也显示了一个向下增长的堆栈。

-- 编辑--

如果处理器具有“PUSH”指令,则堆栈增长的方向由 CPU 给出。对于没有“PUSH”指令的 CPU(如没有 ARM-THUMB 代码的 PowerPC 或 ARM),操作系统必须定义堆栈增长的方向。

【讨论】:

    【解决方案3】:

    堆栈增长方向因操作系统、CPU 架构以及可能的许多其他因素而异。

    最常见的布局是堆栈从内存顶部开始向下增长,而堆从底部开始向上增长。有时情况正好相反,例如。 OSX 之前的 MacOS 将堆栈放在代码区域的正上方,向上增长,而堆从内存顶部开始并向下增长。

    【讨论】:

      【解决方案4】:

      堆栈增长方向的更引人注目的定义是(如果处理器有)中断堆栈。有些架构(如 PowerPC)根本没有硬件堆栈。然后系统设计人员可以决定采用哪种方式来实现堆栈:前置递增、后置递增。减前或减后。

      在 PPC 中,调用使用链接寄存器,如果返回地址未以编程方式保存,则下一次调用会覆盖它。

      PPC 中断使用 2 个特殊寄存器 - “返回地址”和机器状态。这是因为指令可以在中断后“重新启动”——这是流水线架构中处理中断的一种方式。

      pre-increment:堆栈指针在存储到 push 之前递增 - 堆栈指针指向最后使用的项目。在一些更奇怪的 8 位架构(一些第四处理器等)中看到。

      后递增:存储在堆栈指针递增之前完成 - 堆栈指针指向第一个空闲堆栈元素。

      前后递减:与上面类似,但堆栈向下增长(更常见)。

      最常见的是后递减。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-10
        • 2011-11-30
        • 2020-11-08
        • 2012-06-25
        • 2021-10-16
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多