常见JVM虚拟机指令
1.基本常用
指令 解释 new 创建一个对象并将地址放入虚拟机栈 dup 复制一个对象地址放入虚拟机栈 invokespecial 用于调用私有方法及final方法,调用构造方法 invokestatic 用于调用静态方法 invokeinterface 用于调用接口方法 checkcast 确定对象为所给定的类型并强制类型转换 putstatic 设置类中静态字段的值 getstatic 从类中获取静态字段 putfield 设置对象中字段的值 getfield 从对象中获取字段 instanceof 判断对象是否为给定的类型 pop 将上面执行的最近的栈帧弹出栈 istore_0 将上面执行最近的引用地址放入局部变量表地零个槽位(相应的 i 可以替换为s,l,f,d,a,ia,ba,sa,la,fa,da,ca,aa,分别指代int,short,long,float,double,引用类型,int数组,boolean数组,short数组,long数组,float数组,double数组,char数组,引用类型数组) iload_1 将局部变量表中第一个槽位的值或地址放入虚拟机栈(相应的 i 可以替换为s,l,f,d,a,ia,ba,sa,la,fa,da,ca,aa,分别指代int,short,long,float,double,引用类型,int数组,boolean数组,short数组,long数组,float数组,double数组,char数组,引用类型数组) iconst_1 当int取值1-5时,取一个常量放到虚拟机栈(相应的前面的i:int类型,可替换为除了byte的其他几种基本数据类型)。 bipush int取值-128到127时,认为是一个byte类型的值放入虚拟机栈。 sipush int取值-32768到32767时,认为是short类型的值放入虚拟机栈 ldc 当int取值-2147483648到2147483647时,认为是一个long类型的值放入虚拟机栈中。 goto 跳转到某行指令 return 返回方法命令。
2.运算
(相应的 i 可以替换为 s , l, f, d,分别代指int,short,long,float,double)
指令 解释 iadd int类型的加法 isub int类型的减法 imul int类型的乘法 idiv int类型的除法 irem int类型的除法的余数 ineg int类型的取反操作 iinc int类型的本身加上一个常量
3.流程控制
(相应的 i 可以替换为 s , l, f, d,分别代指int,short,long,float,double)
指令 解释 ifeq 是否等于0 ifne 是否不等于0 iflt 是否小于0 ifge 是否大于等于0 ifgt 是否大于0 ifle 是否小于等于0 iflt 是否小于0 if_icmpeq 判断两个值是否相等 if_icmpne 判断两个值是否不相等 if_icmplt 判断先入栈的是否小于后入栈的 if_icmple 判断先入栈的是否小于等于后入栈的 if_icmpgt 判断先入栈的是否大于后入栈的 if_icmpge 判断先入栈的是否大于等于后入栈的 if_icmpgt 判断先入栈的是否大于后入栈的 ifnull 判断是否为空 ifnonull 判断是否不为空
4.比较
指令 解释 lcmp 比较两个值 long类型 fcmpl 比较两个float类型值(当遇到NaN时,返回-1) fcmpg 比较两个float类型值(当遇到NaN时,返回-1) dcmpg 比较两个double类型值(当遇到NaN时,返回-1) dcmpg 比较两个double类型值(当遇到NaN时,返回-1)