bipush如何在JVM中工作?

时间:2018-05-04 05:23:02

标签: java jvm jvm-bytecode

我理解iload接受整数-1到5,但是如何使用bipush指令扩展到更高的数字?如何使用字节码存储特定的整数?

2 个答案:

答案 0 :(得分:2)

我认为你正在寻找处理指令表示的section 2.11 of the JVMS。特别是,它使用了明显的顺序:操作码,紧接着按顺序操作数,big-endian(作为所有Java表示)。在bipush的情况下,这将是the byte 0x10,后跟字面值。

答案 1 :(得分:2)

可以使用几种不同的指令来推动整数常量。

最小的是iconst_ *指令。这些只是一个字节,因为该值是在操作码本身中编码的。 iconst_1,iconst_2等是不同的操作码。例如,iconst_5将被编码为字节08

注意:iload是一个完全不相关的指令,用于加载局部变量的值。你一定在想iconst _ *。

接下来是bipush,它可以在-128和127之间推送一个常量。该指令长度为两个字节 - 第一个字节是操作码,第二个字节是带符号的8位整数。您甚至可以使用它来推送-1到5范围内的常量,但这样做会占用类文件中不必要的空间。例如,bipush 5将被编码为10 05。 (0x10是bipush的操作码)

接下来是sipush,除了存储16位常量而不是8位常量外,它是相同的,因此指令长度为3个字节。 sipush的操作码是0x11,因此sipush 5将被编码为三字节序列11 00 05

您可能想知道如何存储不适合16位的整数常量。在这种情况下,编译器在类文件的单独部分(称为常量池)中创建条目,然后使用ldcldc_w指令来引用常量池条目。

相关问题