我理解iload接受整数-1到5,但是如何使用bipush指令扩展到更高的数字?如何使用字节码存储特定的整数?
答案 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位的整数常量。在这种情况下,编译器在类文件的单独部分(称为常量池)中创建条目,然后使用ldc
或ldc_w
指令来引用常量池条目。