java字节码的不同行为
我是Java字节码的新手。我通过一些示例理解字节码,但我被困在了一个示例中。java字节码的不同行为,java,bytecode,Java,Bytecode,我是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); } } Compil
这些是我的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
}
类simpledd{
公共静态void main(字符参数[]){
INTA、b、c、d;
a=9;
b=4;
c=3;
d=a+b+c;
系统输出打印ln(d);
}
}
从“simpledd.java”编译而来
类simpledd扩展了java.lang.Object{
simplead();
代码:
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:返回
公共静态void main(char[]);
代码:
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;//字段java/lang/System.out:Ljava/io/PrintStream;
17:iload 4
19:invokevirtual#3;//方法java/io/PrintStream.println:(I)V
22:返回
}
我只是想知道,当我们有指令a=9时,为什么会有bipush 9在所有其他情况下都存在iconst。
iconst
可以将常量值-1推到5。它是一个单字节指令
bipush
可以将常量值推到-128和127之间。它是一个双字节指令
要按9键,不能使用
iconst
。没有iconst_9指令。没有iconst_9指令
没有
iconst_9
,因此您必须使用等效的(但效率较低的)bipush
i_const指令的范围仅为0~5,因此它必须通过推送和存储来吐出指令对iconst*指令进行了优化,以在bipush时使用较小且特定的数字(将字节作为整数值推送到堆栈上)适用于较大的数字。没有iconst_9
指令。因此,要按9,不能使用iconst。必须按bipush
bipush 9
将整数文本9按入堆栈。istore_1
将该值存储到局部变量#1。iconst_4
将文本4按入堆栈,然后对于bipush
,它是一个字节还是两个字节,但是只有iconst_1
到iconst_5
字节码——没有iconst_9
iconst
支持值…