作为参考,Burroughs B5000和Inmos Transputer是堆栈机器。 DEC PDP11有这样灵活的寻址模式,它可以用作堆栈机器。我认为Niklaus Wirth's Lilith可能是一个堆栈机器(超过20年前,我的脑海正在滑倒:-)
他们真的没有任何寄存器名称/编号的指令找到操作数,因为他们在堆栈上。
指令可以将即时(常量)值加载到堆栈上,或加载/存储到内存中。
所以他们是没有add.w r0, r1, r5
或add.w eax, [#fe34]
。有add.w
。
所以一个例子(不是在所有准确,这是更复杂的)的汇编序列的可能是
loadstack 0xfe34 -- got fe34 onto stack
loadstackindirect -- use address on the stack, to load the value at that address
add.w -- assumes we already have the other operand on the stack
-- result back onto the stack
要计算并加载在数组中的值,可以使用堆栈因为可能有没有索引寻址模式。
因此,指令很小,大量的工作是隐式地使用堆栈和堆栈指针完成的。 IIRC Transputers实际上只有三个值,编译器(或开发人员)必须确保维护。
XMOS现在出售一个现代的“等值”,并雇用一些相同的人。
自从我编写Transputer代码已经有20多年了,所以很抱歉有点含糊。
UCSD Pascal系统使用软件定义的虚拟机,它是一个堆栈机器。这个想法是为了创造一些可以移植到新电脑上的东西,但也易于编写,易于编译和合理的性能。它的虚拟机被定义为它自己的Pascal方言。当它被移植到真正的计算机上时,寄存器将被用来保存堆栈指针,并且可能在处理堆栈顶部(通过寄存器)方面有一些独创性,以获得合理的性能。
他们*可以*在软件中模拟它,老的JVM就是这样做的。通常尽管堆栈机器代码被编译为本地代码(无论可能的架构如何)。堆栈机器代码很好,因为它具有简洁的编码,它很容易从AST生成并且相对容易分析。 – harold 2012-03-21 10:24:51