Assembly 后进先出算法设计

Assembly 后进先出算法设计,assembly,stack,algorithm,Assembly,Stack,Algorithm,我正在实现一个基于堆栈的虚拟机,我一直在努力阅读有关解释或概述用于处理堆栈的算法的文献,但没有用。下面是一个例子: int i = 3 int j = 4 int k = 5 让我们假设i、j和k是局部变量,因此它们通常存储在堆栈上。程序集/字节码转换如下所示: pushi 3 pushi 4 pushi 5 堆栈将是:543 我有一个整数堆栈和一个字符串堆栈,因此是pushi,但是我的问题是没有将它们存储在堆上(使用一些ptr*或文字标识符),编译器或解释器如何知道如果我想在定义之后执行类

我正在实现一个基于堆栈的虚拟机,我一直在努力阅读有关解释或概述用于处理堆栈的算法的文献,但没有用。下面是一个例子:

int i = 3
int j = 4
int k = 5
让我们假设
i
j
k
是局部变量,因此它们通常存储在堆栈上。程序集/字节码转换如下所示:

pushi 3
pushi 4
pushi 5
堆栈将是:
543

我有一个整数堆栈和一个字符串堆栈,因此是
pushi
,但是我的问题是没有将它们存储在堆上(使用一些
ptr*
或文字标识符),编译器或解释器如何知道如果我想在定义之后执行类似
intx=I+j
,我必须分别弹出两次三次以及尽量不要丢失
k
(将其保存在寄存器或其他东西中,然后将其推回)


我希望我的问题有点道理,也许有一个更聪明的方法:p谢谢你的见解

这通常是通过一种叫做。一次为所有局部变量分配空间(分配/优化到寄存器中的模变量),存储该块的基址,并对从该块开始的偏移量进行操作。然后在作用域退出时将所有内容从堆栈中弹出。

编译器所做的是通过直接添加到堆栈指针,一次获取一堆堆栈空间,然后索引到堆栈值,而不使用push和pop以及正常的内存读取函数。完成后,再将堆栈减去原始值。

您还需要堆栈运算符和中间结果。你在读哪本关于表达式计算和/或编译器设计的书?看看现在没有读任何书。在我的学校,只有谷歌和通过JSTOR的同行评议文章。不过,谢谢你的参考,如果这些书中的大部分不会那么贵的话。但是这是一个关于如何编写编译器的很好的在线资源-。呸-你在这里赢得了速度类型之战:)太棒了,所以在范围解析过程中,编译器会说变量i在memaddress,变量n在memaddress,所以稍后在特定的堆栈帧中,你可以访问i或n,指针就“到达那里”不需要弹出或推送任何东西是的,这也是调试器在堆栈上查找您的东西的方式。