Различное поведение java-байт-кода
Я новичок в Java Bytecode. Я понял байт-код через некоторые примеры, но я застрял в одном примере.
Это мой файл 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
}
Я просто хочу знать, почему существует бипуша 9, когда у нас есть инструкция a = 9
И во всех остальных случаях есть iconst.
Ответы
Ответ 1
iconst
может вызывать постоянные значения от -1 до 5. Это однобайтовая инструкция.
bipush
может вызывать постоянные значения между -128 и 127. Это двухбайтовая инструкция.
Чтобы нажать 9, вы не можете использовать iconst
. Нет инструкции iconst_9
.
Ответ 2
iconst_n определен для n от 0 до 5
Нет iconst_9
, поэтому вам нужно использовать эквивалентный (но менее эффективный) bipush
Ответ 3
нет инструкции iconst_9
Ответ 4
команда i_const может находиться только в пределах от 0 до 5, поэтому она должна плевать на instuction путем нажатия и сохранения