jvm 指令集代码

本文分为3个部分,第一个部分列出常用的jvm指令,每一个指令基本都有几个类似的指令,看名字就知道了,比如像iconst、lconst、fconst、dconst这些主要是针对不同的类型(int、long、float、double),将对应类型的值push到栈顶,其他指令类似,所以基本指令就给出一个例子,其他的联想一个就好,第二部分,给出一小段代码,并给出指令集并详细给出每一行代码的解释。第三部给出jvm全部的指令集,方便查询

jvm基本指令

指令 含义
iconst_1 int型常量值1进栈
bipush 将一个byte型常量值推送至栈顶
iload_1 第二个int型局部变量进栈,从0开始计数
istore_1 将栈顶int型数值存入第二个局部变量,从0开始计数
iadd 栈顶两int型数值相加,并且结果进栈
return 当前方法返回void
getstatic 获取指定类的静态域,并将其值压入栈顶
putstatic 为指定的类的静态域赋值
invokevirtual 调用实例方法
invokespecial 调用超类构造方法、实例初始化方法、私有方法
invokestatic 调用静态方法
invokeinterface 调用接口方法
new 创建一个对象,并且其引用进栈
newarray 创建一个基本类型数组,并且其引用进栈

具体分析

一个简单的code如下,以此分析每一行代码的指令

publicstatic void main(String[] args) {  
inta = 1;  
intb = 9;  
intc = a+b;  
System.out.println(c);  
System.out.println("HelloWorld");  
}  

public static void main(java.lang.String[]);
Code:

jvm基本指令

指令 含义
0: iconst_1 //将int型1推送到栈顶
1: istore_1 //将栈顶元素存入第二个本地变量
2: bipush 9 //将int型9推送到栈顶
4: istore_2 //将栈顶元素存入第三个本地变量
5: iload_1 //将第二个int型数值推送到栈顶
6: iload_2 //将第三个int型数值推送到栈顶
7: iadd //将栈顶两个int数值相加然后推入栈顶
8: istore_3 //将栈顶int型数值存入第四个本地变量
9: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream; //获取指定类的静态域,并将其压入栈顶
12: iload_3 //将第四个int型数值推送到栈顶
13: invokevirtual #22 // Method java/io/PrintStream.println:(I)V //调用实例方法
16: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream; //获取指定类的静态域,并将其压入栈顶
19: ldc #28 // String Hello World //将int、float、String类型常量从常量池中推送带栈顶
21: invokevirtual #30 // Method java/io/PrintStream.println:(Ljava/lang/String;)V //调用实例方法
24: return //从当前方法返回void

全部Jvm指令

参见:

我的另一篇博客

你可能感兴趣的:(jvm 指令集代码)