【问题标题】:Does the processor use more than one stack to separate the call stack from the expression/register stack?处理器是否使用多个堆栈将调用堆栈与表达式/寄存器堆栈分开?
【发布时间】:2016-06-26 18:15:00
【问题描述】:

我正在阅读一些关于处理器内存操作的基本文章,我对处理器如何处理接下来的内容感到困惑。

调用堆栈的概念很清楚,但我想知道表达式堆栈/寄存器堆栈(用于进行计算)是否是同一个堆栈,或者即使是子程序的局部变量的堆栈(一个函数) 在一个程序中是同一个调用栈。

如果有人可以向我解释处理器是如何处理其堆栈的,那将对我有很大帮助。

【问题讨论】:

  • 这不是由编译器做出的更多决定(取决于操作系统和库的调用约定)吗? CPU 对任何内存安排都很好,它只是运行指令。我想你可以在不使用任何堆栈的情况下编写代码。
  • @Thilo:如果 CPU 不能轻松高效地执行此操作,那么设计一个使用单独堆栈进行暂存空间和参数传递的 ABI 将是愚蠢的。例如,在 x86 中,它会占用另一个寄存器(在 32 位模式下仅保留 8 个寄存器中的 6 个作为“通用”),而小型高效的 push / pop 指令仅适用于 rsp。因此,将寄存器保存/恢复到“手动”堆栈将需要更多代码字节(以及更多指令,因为您必须手动子/添加到 rbp(第二个堆栈指针的明显选择)。
  • @PeterCordes:这可能是 Rafael 正在寻找的答案:一个 CPU 应该有多组堆栈操作/寄存器来有效地支持多个堆栈(而 x86 没有)。
  • @PeterCordes 所以对于不同的线程,处理器使用相同的堆栈但不同的指针?
  • 超线程(SMT:同一物理内核上的多个逻辑 CPU)提供了两个完全独立的上下文以及它们自己的架构状态。内核上线程之间的 OS 任务切换完全用另一个线程替换了一个线程的体系结构状态。不同的线程总是有自己的栈。 (它们都可以从进程地址空间中的同一大块虚拟内存中分割出来,但是如果一个线程将其数据写入另一个线程用来保存/恢复某些内容的堆栈空间,那么您的程序将无法运行。)

标签: cpu-registers cpu-architecture processor stack-memory stack-machine


【解决方案1】:

您可以更改堆栈只需设置 SS:SP 段和指针寄存器(只需保存当前值) 过程调用参数和局部变量发生在堆栈中。动态创建的对象发生在堆中(DS:DI)。 SS:SP 寄存器对移动了正确的字节数,以保留过程调用所需的内存。并且在返回时 SS:SP 设置回预调用状态。

【讨论】:

    【解决方案2】:

    我工作过的所有处理器都只使用了一个堆栈。

    如果您考虑处理器在做什么,您只需要一个堆栈。在计算期间,您可以使用与调用堆栈相同的堆栈,因为当计算完成时,堆栈将再次“干净”。局部变量也是如此,就在您离开局部变量的范围之前,您的堆栈将是干净的,允许调用正确返回。

    【讨论】:

      猜你喜欢
      • 2014-06-23
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2011-05-28
      相关资源
      最近更新 更多