CPU支持堆栈意味着什么?

电器工程 中央处理器 计算机架构
2022-01-15 06:34:14

CPU怎么能不支持堆栈呢?是否任何使用子程序的架构(我很确定这是所有架构)都必须将返回地址推送到堆栈上,以便它可以返回到它调用子程序的位置?栈只是意味着一段内存,它有一个向某个方向增长并充当栈数据结构的指针,不是吗?我只是不明白架构如何不支持堆栈。

自动内存存储(自动变量与静态变量)在多大程度上由编译器与硬件架构决定?

3个回答

有许多低级微控制器具有用于子程序调用/返回和中断处理的硬件堆栈,但是即使不是不可能,也很难在其中存储数据(变量),并且实现纯软件数据堆栈将非常低效。8051 是一个典型的例子,低端 PIC(PIC12/PIC16)是另一个例子。在这些机器上,通过为自动变量分配静态存储位置来模拟数据堆栈,这些位置的重用量取决于编译器的复杂程度。

请注意,如果以这种方式进行堆栈模拟,则意味着递归(直接或间接调用自身的函数)不起作用,因为函数的每个实例都为其所谓的“私有”变量重用相同的静态位置。一些编译器确实允许有限地使用递归(通常通过#pragma某种方式实现),这将导致它创建一个真正的数据堆栈,无论它减慢了多少速度。

顺便说一句,有些 CPU 架构根本没有硬件堆栈,甚至没有用于子程序/中断处理,包括 DEC PDP-8 和 IBM System/360。在这些机器上,PC(返回地址)和状态寄存器(用于中断)保存在寄存器或内存位置,但在我能想到的每一种情况下,机器也有足够灵活的地址模式,可以很容易地创建堆栈用软件。

“支持堆栈”是指

  1. 具有显式堆栈指针寄存器,并且
  2. 具有用于操作/使用堆栈指针寄存器的原始机器代码指令(如 reti,它根据堆栈指针更改程序计数器以便从函数调用返回)。

您可以通过仿真在没有硬件支持的情况下对其进行仿真,这是编译器生成的代码,与 RAM 中使用变量的同类事物相同。在任何现代计算机体系结构中都很少/不直接支持堆栈。

对于任何高于直接汇编的语言,编程语言中变量的语义几乎与目标硬件架构无​​关。编译器的工作是生成符合编程语言语义契约的机器代码。

一些体系结构(例如 PIC)具有功能有限的硬件堆栈(只能用于返回地址,不能用于变量)。一些极小的架构没有存储和递增或 PUSH 指令,因此做堆栈更加繁琐。

C 中的“auto”变量应始终编译为具有“auto”初始化行为的东西,以及具有静态行为的“static”;在某些架构上,您不允许进行递归,在这种情况下,编译器可以静态分配所有变量。