16

我是 Java 字节码的新手。我通过一些示例来理解字节码,但我陷入了一个示例。
这些是我的 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

}  

我只想知道当我们有指令 a = 9 时为什么会有 bipush 9
而在所有其他情况下都有 iconst。

4

6 回答 6

23

iconst可以将常量值 -1 推送到 5。它是单字节指令。

bipush可以将常数值推入 -128 和 127 之间。它是一个两字节指令。

要推动 9,您不能使用iconst. 没有iconst_9指示。

于 2012-08-04T20:32:16.880 回答
6

iconst_n 定义为从 0 到 5 的 n

没有iconst_9,所以你必须使用等效的(但效率较低)bipush

于 2012-08-04T20:33:46.120 回答
0

没有 iconst_9 指令

于 2012-08-04T20:33:31.493 回答
0

i_const 指令的范围只有 0~5,所以它必须通过 push 和 store 吐出指令

于 2013-03-13T04:20:50.273 回答
0

指令iconst_* 被优化用于处理小的和特定的数字,而bipush(将一个字节作为整数值压入堆栈)适用于更大的数字。

于 2018-08-04T13:49:50.227 回答
0

没有iconst_9指示。所以要推 9 你不能使用 iconst。你必须去bipush

于 2018-08-16T17:35:07.580 回答