gpt4 book ai didi

java - 我应该如何使用自定义编译器管理内存?

转载 作者:行者123 更新时间:2023-12-01 19:12:27 26 4
gpt4 key购买 nike

我正在用 Java 创建 8 位处理器的模拟器。它的架构非常简单,只有一个 4 字节寄存器和 256 字节主存储器。我已经实现了一个“硬件”堆栈,因此处理器支持 PUSHPOPGET。堆栈从最后一个内存单元向后填充,因此“正常”内存使用应从单元 0 开始。您不必保留内存,程序默认情况下能够使用完整的 256 字节。

我还在为这个处理器创建一个编译器,它是用我发明的一种简单语言进行编译的。目前,定义的每个变量(我只支持一种 8 位整数类型)都被分配给一个内存单元,从 0 开始并递增。所以我最多有 256 个(如果堆栈为空)变量。目前,我不想改变这一点。

我的下一个目标是添加使用无返回类型的无参数过程的能力。函数中声明的变量应在自动返回之前释放。那么我应该在哪里存储变量呢?我将在开头的变量和内存末尾的“硬件”堆栈之间创建一个“软件”堆栈。我首先想到使用硬件堆栈来实现此目的,但我想将它用于方法本身的调用和返回。有没有比创建第二个“软件”堆栈更好的解决方案?

最佳答案

每个函数在调用时都应在堆栈上创建一个激活帧/调用堆栈,其中包括用于返回地址、任何参数以及在函数内创建的任何局部变量的空间。至少,您的情况下的激活帧应该包含调用代码的返回地址。发挥作用的额外数据取决于您的函数是否接受参数,和/或它是否创建函数本地的任何变量。您的堆栈可能如下所示:

+------------------+
| Return address |
+------------------+
| Parameter 0 |
+------------------+
| ... |
+------------------+
| Parameter N |
+------------------+
| Local Var 0 |
+------------------+
| ... |
+------------------+
| Local Var N | <--- Top of Stack
+------------------+

由于您已经在堆栈中使用主内存,因此激活帧也将驻留在此处。我假设您的处理器有一个指向堆栈顶部的堆栈指针?

可以创建两个堆栈,但随后您需要决定将该堆栈放在哪里以及它应该消耗多少内存。您想将一半主内存用于硬件堆栈,另一半用于软件堆栈吗?这也意味着您限制了可以进行的嵌套调用(甚至递归)调用的数量。相反,您可以使用另一种方法来节省内存使用。执行此操作的方法是在调用函数之后将参数包含到函数中(您的汇编程序必须执行此操作):

+--------------+
| JMP FUNC | Call the function
+--------------+
| Parameter 0 | <--- return address points here
+--------------+
| ... |
+--------------+
| Parameter N |
+--------------+
| (other code) | <--- after function call, return address should be fixed to point here
+--------------+

这意味着您必须在函数内部做更多的工作来加载参数。如果您还记得的话,返回地址是堆栈上的第一个值。您可以加载该值,然后索引该值以加载您的参数。加载完参数后,您需要调整返回地址的值,以便它指向在您定义的参数之后开始的代码。

关于java - 我应该如何使用自定义编译器管理内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7956831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com