Phi*_*ipp 2 bytecode vm-implementation
我已经用 Java 创建了一个原型 VM(因为它是我最熟悉的语言),并且我尝试以字节码格式存储指令。我想知道如何在字节码中存储值,因为byte只能是 0 到 255。
举个例子:
push 4752
Run Code Online (Sandbox Code Playgroud)
Push 的操作码值为 0。但是我如何存储 4752?它不适合单个字节。我可以将值存储在 4 个字节中,因此允许它们是 32 位整数,但随后我必须决定是加载操作码(1 个字节)还是一个值(4 个字节)。目前,我将程序作为整数数组传递,VM 循环遍历该数组并执行操作码。如果操作码需要一个值,它会从数组中获取该值,然后增加程序计数器以跳过该值,以便它不会被执行。
我试图弄清楚像 JVM 这样的虚拟机是如何做到这一点的,但我无法找到答案。
JVM 有几个选项可以允许对预期更频繁的情况进行较小的编码,从而平均对方法和类进行较小的编码。具体请参阅https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5(或se8,但IIRC没有任何基本算术/计算指令)下的说明 7和8之间变化,只有一两个调用指令):
您的示例值 4752 适合两个字节,并且将使用sipush。
为了扩展你的问题,longJVM 中的(64 位或 8 字节)值主要是通过推送然后扩大它,或者通过推送变量或字段(或方法返回)int中的值来创建的。long有一条指令ldc2_w用于从常量池中推送 2 单元(8 字节)值,还有两条专用于频繁的指令lconst_0和lconst_1,分别用于 0 和 1。
| 归档时间: |
|
| 查看次数: |
450 次 |
| 最近记录: |