Answers:
许多低级微控制器都具有用于子例程调用/返回和中断处理的硬件堆栈,但是,即使不是没有可能,也很难在其中存储数据(变量),并且实现纯软件数据堆栈的效率极低。8051是一个经典示例,而低端PIC(PIC12 / PIC16)是另一个示例。在这些机器上,通过为自动变量分配静态存储位置来模拟数据堆栈,这些位置的重用量取决于编译器的复杂程度。
请注意,如果以此方式进行堆栈仿真,则意味着递归(直接或间接调用自身的函数)不起作用,因为该函数的每个实例都为其假定的“私有”变量重用了相同的静态位置。一些编译器确实允许有限地使用递归(通常通过#pragma
某种方式实现),无论递减多少,都会导致它创建一个真实的数据堆栈。
顺便说一句,包括DEC PDP-8和IBM System / 360在内,甚至根本没有用于子例程/中断处理的CPU架构根本没有硬件堆栈。在这些机器上,PC(返回地址)和状态寄存器(用于中断)被保存在寄存器或存储器位置,但是在我能想到的每种情况下,机器还具有足够灵活的地址模式,这使得创建堆栈变得容易与软件。
“支持堆栈”是指
您可以在没有硬件支持的情况下通过仿真来进行仿真,仿真是编译器生成的代码,与使用变量的RAM中的事物相同。在任何现代计算机体系结构中都没有直接支持堆栈的情况很少见。
对于比直接汇编更高的任何语言,编程语言中变量的语义几乎与目标硬件体系结构无关。编译器的工作是生成符合编程语言语义约定的机器代码。