Java字节码的不同行为(Different behaviour of java bytecode)

2019-06-26 18:17发布

我在Java字节码一个newbee。 我了解过一些例子,字节码,但我陷入了一个例子。
这是我的Java和字节码文件

class SimpleAdd{
    public static void main(char args[]){
        int a,b,c,d;
        a = 9;
        b = 4;
        c = 3;
        d = a + b + c;
        System.out.println(d);
    }
}  
Compiled from "SimpleAdd.java"
class SimpleAdd extends java.lang.Object{
SimpleAdd();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(char[]);
  Code:
   0:   bipush  9
   2:   istore_1
   3:   iconst_4
   4:   istore_2
   5:   iconst_3
   6:   istore_3
   7:   iload_1
   8:   iload_2
   9:   iadd
   10:  iload_3
   11:  iadd
   12:  istore  4
   14:  getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   17:  iload   4
   19:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   22:  return

}  

我只是想知道为什么会出现bipush 9时,我们有指令= 9
而在所有其他情况下,有ICONST。

Answer 1:

iconst可以推恒定值-1到5,它是一个单字节指令。

bipush可以推-128和127之间的恒定值它是一个2字节指令。

推9,你不能使用iconst 。 没有iconst_9指令。



Answer 2:

iconst_n从0到5定义的对于n

有没有iconst_9 ,所以你必须使用等效的(但不efficent) bipush



Answer 3:

没有iconst_9指令



Answer 4:

所述i_const指令只有范围从0〜5,所以它必须通过吐推和存储的instuction



Answer 5:

iconst_ *指令被优化的小和特定号码时工作bipush(推字节到堆栈作为一个整数值)适用于更大的数字。



Answer 6:

没有iconst_9指令。 所以推9不能使用ICONST。 你必须去bipush



文章来源: Different behaviour of java bytecode
标签: java bytecode