我正在实现一个基于堆栈的虚拟机,我一直在尝试阅读解释或概述用于处理堆栈的算法的文献,但无济于事。这是一个例子:
int i = 3
int j = 4
int k = 5
假设i
,j
和k
是局部变量,因此传统上它们将存储在堆栈中。汇编/字节码转换看起来像:
pushi 3
pushi 4
pushi 5
堆栈将是:5 4 3
我有一个整数堆栈和一个字符串堆栈,因此pushi
,但是我的问题是没有将它们存储在堆上(带有一些ptr*
或文字标识符),编译器或解释器将如何?知道如果我想在定义之后做int x = i + j
这样的事情,我必须分别弹出两个和三个次,以及< / strong>尽量不要丢失k
(将其保存在寄存器或其他内容中,然后将其推回)?
我希望我的问题有所了解,并且可能有更聪明的方法:P谢谢你的任何见解!
答案 0 :(得分:2)
这通常使用名为stack frame的内容来完成。您一次为所有局部变量分配空间(模块变量分配/优化到寄存器中),存储该块的基址,并对那里的偏移进行操作。然后在范围退出时将所有内容从堆栈中弹出。
答案 1 :(得分:2)
编译器在这种情况下做的是通过直接添加到堆栈指针一次获取一堆堆栈空间,然后索引到堆栈值而不使用push和pop以及正常的内存读取函数。然后在完成时将堆栈减去其原始值。