gpt4 book ai didi

bytecode - 以字节码格式存储值

转载 作者:行者123 更新时间:2023-12-03 09:20:50 24 4
gpt4 key购买 nike

我已经用 Java 创建了一个原型(prototype) VM(因为它是我最熟悉的语言),并且我正在尝试以字节码格式存储指令。我想知道如何在字节码中存储值,因为字节只能是 0 到 255。

举个例子:

push 4752

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之间没有任何基本算术/计算指令发生变化,只有一两个调用指令):

  • iconst_是将特定值“m1”(-1)推送到5的单独操作码
  • bipush 从指令流中推送下一个字节
  • sipush从指令流中推送接下来的两个字节
  • ldcldc_w 从常量池中推送一个四字节值,由指令流中的索引选择

您的示例值 4752 适合两个字节,并且将使用sipush

为了扩展你的问题,JVM中的long(64位或8字节)值主要是通过推送int然后扩大它,或者通过推送来自 long 变量或字段(或方法返回)的值。有一条指令ldc2_w从常量池中推送一个2单元(8字节)的值,还有两条特殊频繁指令lconst_0lconst_1 对于 0 和 1。

关于bytecode - 以字节码格式存储值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31637525/

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