CPU支持堆栈是什么意思?


11

CPU如何不支持堆栈?使用子例程的任何体系结构(我很确定这是所有体系结构)是否都不必将返回地址压入堆栈,以便它可以返回到调用子例程的位置?堆栈仅表示具有指向特定方向的指针并充当堆栈数据结构的一部分内存。我只是不了解架构如何不支持堆栈。

编译器与硬件体系结构在多大程度上确定了自动内存存储(自动变量还是静态变量)?

Answers:


8

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

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

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


1
某些早期的计算机会将跳转指令写入代码中,以引起返回(没有间接跳转),从而使折返函数不切实际(理论上可以跳转到跳转,但这会增加复杂性,在某些情况下,尤其是当数据地址已完全编码时)在说明中)。
保罗·克莱顿

4

“支持堆栈”是指

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

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

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


1
大多数RISC ISA(例如MIPS [不包括MIPS16和microMIPS],Alpha,SPARC,PA-RISC,Power,SuperH)都没有显式的堆栈指针寄存器,而是在ABI中进行了定义。与MIP16和microMIPS(用于代码密度)一样,ARM是一个例外(部分是因为它遮盖了SP的几种操作模式)。
Paul A. Clayton

2

一些架构(例如PIC)的硬件堆栈功能有限(只能用于返回地址,而不能用于变量)。一些极小的体系结构没有存储并递增或PUSH指令,因此执行堆栈更容易。

C中的“自动”变量应始终编译为具有“自动”初始化行为的对象,并被编译为具有静态行为的“静态”对象;在某些架构上,不允许进行递归,在这种情况下,编译器可以静态分配所有变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.