看 java 指令集做了什么

java指令由一个字节存储,根据不同指令后面跟不同操作数,可能零个,可能多个,对于指令集的描述这里只解释样例中有使用到的


看代码

class Test {
    public static void main(String[] args) {
        int num=200;
        for(int i=1;i<=100;i++){
            num+=i;
        }
    }
}

使用javap查看编译之后的code

public static void main(java.lang.String[]);
  Code:                                     
     0: sipush        200                   
     3: istore_1                            
     4: iconst_1                            
     5: istore_2                            
     6: iload_2                             
     7: bipush        100                   
     9: if_icmpgt     22                    
    12: iload_1                             
    13: iload_2                             
    14: iadd                                
    15: istore_1                            
    16: iinc          2, 1                  
    19: goto          6                     
    22: return                              

执行指令后对应局部变量表和操作数栈的变化

看 java 指令集做了什么_第1张图片

指令解释

指令位置 指令 解释
0 bipush 200 200推入操作数栈顶
3 istore_1 200弹出操作数栈顶,存入局部变量表索引1
4 iconst_1 1推入操作数栈顶
5 istore_2 1弹出操作数栈顶,存入局部变量表索引2
6 iload_2 加载局部变量表索引2到操作数栈(1)
7 bipush 100 100推入操作数栈
9 if_icmpgt 22 比较栈顶两个元素,根据结果决定是否跳转,栈顶两元素会被弹出( 如果1大于100,对应代码i<=100,则跳转到22 return)
12 iload_1 加载局部变量表索引1到操作数栈(200)
13 iload_2 加载局部变量表索引2到操作数栈(1)
14 iadd 栈顶两元素相加(200+1),再压入栈顶
15 istore_1 栈顶元素(201)存入局部变量表索引1
16 iinc 2,1 栈顶元素索引2 加1 (对应代码i++)
19 goto 6 跳转到指令位置6,(循环)
22 return return

目前只了解到这里,如有错误,欢迎指正。

你可能感兴趣的:(看 java 指令集做了什么)