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 までの定数値をプッシュできます。これは 1 バイト命令です。

bipush-128 ~ 127 の定数値をプッシュできます。これは 2 バイトの命令です。

9 を押すには は使用できませんiconsticonst_9指示はありません。

于 2012-08-04T20:32:16.880 に答える
6

iconst_n is defined for n from 0 to 5

There's no iconst_9, so you have to use the equivalent (but less efficent) bipush

于 2012-08-04T20:33:46.120 に答える
0

命令 iconst_* は、小さい特定の数値で動作するように最適化されていますが、bipush (1 バイトを整数値としてスタックにプッシュする) は、より大きな数値で動作します。

于 2018-08-04T13:49:50.227 に答える
0

iconst_9 命令はありません

于 2012-08-04T20:33:31.493 に答える
0

i_const 命令の範囲は 0 ~ 5 のみであるため、プッシュとストアによって命令を吐き出す必要があります。

于 2013-03-13T04:20:50.273 に答える