为了账号安全,请及时绑定邮箱和手机立即绑定

怎么理解JVM中的iload和istore指令

/ 猿问

怎么理解JVM中的iload和istore指令

慕慕森 2018-10-12 18:35:54

我最近在学习JVM,被istore和iload两条指令困扰了。
以下是我查看《Java虚拟机规范》得到的解释

  • 将一个局部变量加载到操纵栈的指令包括:iload、iload_、lload…

  • 将一个数值从操作数栈存储到局部变量表的指令包括:istore、istore_、lstore…

下面是我的java代码

    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         //返回

从上面字节码的分析看,指令4已经将计算结果压入到操作数栈了,而指令6又是把结果压入到操作数栈,这不是重复工作吗。
如果存入操作数栈的意义是为了可以store到局部变量表中,那第6步又为什么要load到操作数栈上。
不知道,是不是我哪步理解错了,谢谢指点。


查看完整描述

2 回答

?
HUWWW

楼上正解,其实结合代码看下就可以很明白的看出原因了。

首先这个方法是静态方法,所以局部变量数组【0】【1】【2】对应的变量分别为a、b、c;

0: iconst_0        //常量0入栈

1: istore_2        //将栈顶出栈,即c=0;

2: iload_0         //复制a变量的值入栈

3: iload_1         //复制b变量的值入栈

4: iadd            //将栈顶两个元素出栈,做加法,然后把结果再入栈(即a,b出栈,将a+b入栈)

5: istore_2        //栈顶元素出栈,即c=和;  此时栈为空

6: iload_2         //将c赋值压入栈

7: ireturn         //返回栈顶元素


查看完整回答
1 反对 回复 2018-10-28
  • 慕容5095203
    慕容5095203
    哥哥 有个疑问想问下 我看书上说第0个局部变量一定用来存储该实例方法所在对象的引用。后续的其他参数从1开始。为啥这边却不是这样的啊?
  • 慕容5095203
    慕容5095203
    是因为static吗?
  • 慕前端2177105
    慕前端2177105
    是这样的
?
摇曳的蔷薇

如果把代码换成

public static int add(int a,int b){  

      int c=0;        
      return a+b;
    }

那么指令对应就是:

       0: iconst_0       
       1: istore_2       
       2: iload_0       
       3: iload_1       
       4: iadd       
       5: ireturn

编译器就是按照代码来生成的,如果直接 return a + b,那么也不会多出来第五步和第六步。


查看完整回答
反对 回复 2018-10-28

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信