我的指令如何知道操作数堆栈上的地址指向什么?

How does my instruction know what the address on the operand stack points to?

我正在编写一个字节码编译器和一个虚拟机。我可以通过将任何非整数值放入常量池并将 4 字节整数地址压入堆栈来使用常量。那部分很好。

但现在我要添加存储在我称为 "Ram" 的虚拟内存区域中的全局变量。当然,我存储在那里的值也会像常量一样按地址索引。假设我将两个地址压入操作数堆栈,然后 运行 我的 FADD(浮动加法)——当指令从堆栈中弹出两个地址以执行加法时,它如何知道这些地址是否来自全局内存而不是常量池?标准方法是什么?

FADD 不应该是出栈地址,应该是出栈值。

您应该有常量和读取内存的说明。这些指令应该将结果值压入堆栈——而不是常量 table 中的索引或地址。永远不要将常量的索引压入堆栈 - 常量本身的值应该。

FADD 然后应该简单地从堆栈中弹出两个值并将它们相加 - 它不需要在常量 table 或内存中查找任何内容,因为这应该已经处理过了按照专门的说明。

例如,给定常量 table [0: 1.0, 1: 0x10],将 1.0 添加到存储在地址 0x10 的任何值(假设为 4.2)的指令可以看起来像这样(假设 CONST 指令将常量 table 中给定索引处的值推入堆栈,而 LOAD 指令弹出堆栈地址并将值推入该位置地址入栈):

FCONST 0  // Stack: [1.0]
ICONST 1  // Stack: [1.0, 0x10]
FLOAD     // Stack: [1.0, 4.2]
FADD      // Stack: [5.2]