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
执行指令后对应局部变量表和操作数栈的变化
指令解释
指令位置 | 指令 | 解释 |
---|---|---|
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 |
目前只了解到这里,如有错误,欢迎指正。
网友评论