我是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
}
我只想知道为什么当我们有指令a = 9时有双推9 而在所有其他情况下都有iconst。
答案 0 :(得分:22)
iconst
可以将常量值-1推送到5.这是一个单字节指令。
bipush
可以在-128到127之间推送常量值。这是一个双字节指令。
要按9,您无法使用iconst
。没有iconst_9
指令。
答案 1 :(得分:6)
iconst_n is defined for n from 0 to 5
没有iconst_9
,所以你必须使用等效的(但效率较低)bipush
答案 2 :(得分:0)
没有iconst_9指令
答案 3 :(得分:0)
i_const指令的范围仅为0~5,因此必须通过推送和存储来吐出指令
答案 4 :(得分:0)
icont_ *指令经过优化,可使用较小的特定数字,而bipush(将一个字节作为整数值压入堆栈)则适用于较大的数字。
答案 5 :(得分:0)
没有iconst_9
指令。因此,要推送9,您不能使用iconsst。您必须参加bipush