简单指令解析
2020-05-29 本文已影响0人
抬头挺胸才算活着
参考资料:
怎么理解JVM中的iload和istore指令
栈:包括局部变量表,操作数栈,动态链接,方法出口等
操作数栈:用来加载数字,或者加减数字
局部变量表:存放局部变量
下面的几个指令都是以操作数栈为中心的
iconst等,将数字加载到操作栈
iload等,将局部变量表加载到操作数栈
istore等,将操作数栈的结果保存到局部变量表
有了上面的知识,看下下面的代码,如果熟悉的话甚至能推倒出字节码。
int c=0;
:要将0加载到操作数栈(iconst_0),然后再将操作数栈加载到局部变量表的第二个位置(istore_2)。
c=a+b;
:将a和b从局部变量表加载到操作数栈(iload_0,iload_1),在操作数栈中相加(add),再将结果从操作数栈存到局部变量表第二个位置(istore_2)。
return c
:将局部变量表第二个位置存储到操作数栈(iload_2),返回(ireturn)。
public static int add(int a,int b){
int c=0;
c=a+b;
return c;
}
最后的字节码
0: iconst_0 //常量0压入操作数栈
1: istore_2 //弹出操作数栈栈顶元素,保存到局部变量表第2个位置
2: iload_0 //第0个变量压入操作数栈
3: iload_1 //第1个变量压入操作数栈
4: iadd //操作数栈中的前两个int相加,并将结果压入操作数栈顶
5: istore_2 //弹出操作数栈栈顶元素,保存到局部变量表第2个位置
6: iload_2 //加载局部变量表的第2个变量到操作数栈顶
7: ireturn //返回