繁体   English   中英

bipush在JVM中如何工作?

[英]How does bipush work in JVM?

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

我认为您正在寻找JVMS的2.11节 ,其中涉及指令表示。 特别是,它使用明显的顺序:操作码,紧随其后的是操作数,顺序为big-endian(作为所有Java表示形式)。 bipush的情况下,这将是字节0x10,后跟文字值。

有几种不同的指令可用于推送整数常量。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM