简单指令解析

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         //返回
上一篇 下一篇

猜你喜欢

热点阅读