加载和存储指令
类型 | 指令 |
---|
将一个局部变量加载到操作栈 | iload,iload_< n>,lload,lload_< n>,fload,fload_< n>,dload,dload_< n>,aload,aload_< n> |
将一个数值从操作数栈存储到局部变量表 | istore,istroe_< n>,lstore,lstore_< n>,fstore,fstore_< n>,dstore,dstore_< n>,astore,astore_< n> |
将一个常量加载到操作数栈 | bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,lconst_< l>,fconst_< f>,dconst_< d> |
扩充局部变量表访问索引的指令 | wide |
运算指令
类型 | 指令 |
---|
加法指令 | iadd、ladd、fadd、dadd |
减法指令 | isub、lsub、fsub、dsub |
乘法指令 | imul、lmul、fmul、dmul |
除法指令 | idiv、ldiv、fdiv、ddiv |
求余指令 | irem、lrem、frem、drem |
取反指令 | ineg、lneg、fneg、dneg |
位移指令 | ishl、ishr、iushr、lshl、lshr、lushr |
按位或指令 | ior、lor |
按位与指令 | iand、land |
按位异或指令 | ixor、lxor |
局部变量自增指令 | iinc |
比较指令 | dcmpg、dcmpl、fcmpg、fcmpl、lcmp |
类型转换指令
宽化处理:
JVM直接支持小范围类型转换到大范围类型
- int可以直接转换为long,float和double
- long可以直接转换为float,double
- float可以直接转换为double
窄化处理:
类型 | 指令 |
---|
int的窄化 | i2b,i2c,i2s |
long的窄化 | l2i |
float的窄化 | f2i,f2l |
double的窄化 | d2i,d2l,d2f |
float转窄化为整数类型
如果浮点值是NaN,那么转换的结果就是 int或者long类型的0
如果浮点值不是无穷大的话,浮点值使用IEEE754的向零模式取整,获得的整数值为v,如果v在目标类型T(int或者是long)的表示范围之内,那转换结果就是v。
否则,将根据v的符号,转换为T所能表示的最大或者是最小的正数。
对象创建与访问指令
类型 | 指令 |
---|
创建类实例的指令 | new |
创建数组的指令 | newarray,anewarray,mulitanewarray |
访问类字段(static字段,或者称为类变量)和实例字段(非static字段,或者称为实例变量)的指令 | getfield,putfield,getstatic,putstatic。 |
把一个数组元素加载到操作数栈的指令 | baload,caload,saload,iaload,laload,faload,daload,aaload |
把一个操作数栈的值存储到数组元素中的指令 | bastore,castore,sastore,iastore,fastore,dastore,aastore |
取数组长度的指令 | arraylength |
检查类实例类型的指令 | instanceof,checkcast |
操作数栈管理指令
类型 | 指令 |
---|
将操作数栈的栈顶一个或者两个元素出栈 | pop,pop2 |
复制栈顶的一个或者两个数值并将复制值或者双分的复制值重新压入栈顶 | dup,dup2,dup_x1,dup2_x1,dup_x2,dup2_x2 |
将栈最顶端的两个数值互换 | swap |
控制转移指令
类型 | 指令 |
---|
条件分支 | ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull, if_icmpeq,if_icmpne,ificmplt,ificmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne |
复合条件分支 | tableswitch,lookupswitch |
无条件分支 | goto,goto_w,jsr,jsr_w,ret |
方法调用和返回指令
指令 | 作用 |
---|
调用对象的实例方法,根据对象实际类型进行分派 | invokevirtual |
调用接口方法,在运行时搜索一个实习了这个接口方法的对象,找出适合的方法进行调用 | invokeinterface |
调用一些需要特殊处理的实例方法,包括初始化方法,私有方法和父类方法 | invokespecial |
调用类方法 | invokestatic |
在运行时动态解析出调用点限定符所引用的方法并执行该方法 | invokedynamic |
异常处理指令
Java中的显式抛出异常的操作(throw)都由athrow指令来实现。
整数运算中如果除数为0,则会在idiv或者ldiv中抛出ArithmeticException异常。
同步指令
同步一段指令集序列通常是由java语言中的synchronized语句块来表示,JVM指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义。