JVM执行栈指令集实例剖析
public class MyTest8 {
public int myCalculate(){
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int result = (a+b-c) * d;
return result;
}
}
反编译之后结果:
public int myCalculate();
descriptor: ()I
flags: ACC_PUBLIC
Code:
stack=2,locals=6,args_size=1 //栈最大深度为2,最多6个局部变量,参数的数量是1:this(在索引0位置)
0: iconst_1 //将操作数 1 推送至栈顶
1: istore_1 //将操作数栈顶元素1弹出来,然后将该元素的值设置为局部变量表中的索引为1的局部变量的值
2: iconst_2 //将操作数 2 推送至栈顶
3: istore_2 //将操作数栈顶元素2弹出来,然后将该元素的值设置为局部变量表中的索引为2的局部变量的值
4: iconst_3 //将操作数 3 推送至栈顶
5: istore_3 //将操作数栈顶元素3弹出来,然后将该元素的值设置为局部变量表中的索引为3的局部变量的值
6: iconst_4 //将操作数 4 推送至栈顶 (因为istore只有istore_1~istore_3,所以下面没有下划线)
7: istore 4 //将操作数栈顶元素4弹出来,然后将该元素的值设置为局部变量表中的索引为4的局部变量的值
9: iload_1 //将局部变量表中(栈帧)索引为1的值推送到栈中
10: iload_2 //将局部变量表中(栈帧)索引为2的值推送到栈中
11: iadd //将栈中的 1、2取出来,进行 加 运算,运算之后再将得到的结果3放置到栈顶
12: iload_3 //将局部变量表中(栈帧)索引为3的值推送到栈中
13: isub //将栈中的 3、3取出来,进行 减 运算,运算之后再将得到的结果4放置到栈顶
14: iload 4 //将局部变量表中(栈帧)索引为4的值推送到栈中
16: imul //将栈中的 4、4取出来,进行 × 运算,运算之后再将得到的结果5放置到栈顶
17: istore 5 //将栈中的结果5的操作数弹出来,将该值赋给局部变量表中(栈帧)中索引为5的局部变量的值
19: iload 5 //将局部变量表中(栈帧)索引为5的值推送到栈中
21: ireturn //将当前栈中栈顶的元素值弹出并作为该方法的返回值,栈中剩余的元素全部舍弃