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 创建一个基本类型数组,并且其引用进栈
操作数栈(operand stack)相关
本地变量表(local variable table)到操作数栈(operand stack)
- iload 将指定的int型本地变量推送至栈顶
- iload_x 将第x个int型本地变量推送至栈顶,x范围:[0, 3]
- lload 将指定的long型本地变量推送至栈顶
- lload_x 将第x个long型本地变量推送至栈顶,x范围:[0, 3]
- fload 将指定的float型本地变量推送至栈顶
- fload_x 将第x个flaot型本地变量推送至栈顶,x范围:[0, 3]
- dload 将指定的double型本地变量推送至栈顶
- dload_x 将第x个double型本地变量推送至栈顶,x范围:[0, 3]
- aload 将指定的引用类型本地变量推送至栈顶
- aload_x 将第x个引用类型本地变量推送至栈顶,x范围:[0, 3]
操作数栈(operand stack)到本地变量表(local variable table)
- istore 将栈顶int型数值存入指定本地变量
- istore_x 将栈顶int型数值存入第x个本地变量,x范围:[0, 3]
- lstore 将栈顶long型数值存入指定本地变量
- lstore_x 将栈顶long型数值存入第x个本地变量,x范围:[0, 3]
- fstore 将栈顶float型数值存入指定本地变量
- fstore_x 将栈顶float型数值存入第x个本地变量,x范围:[0, 3]
- dstore 将栈顶double型数值存入指定本地变量
- dstore_x 将栈顶double型数值存入第x个本地变量,x范围:[0, 3]
- astore 将栈顶引用类型存入指定本地变量
- astore_x 将栈顶引用类型存入第x个本地变量,x范围:[0, 3]
常数(constant)到操作数栈(operand stack)
- bipush 将单字节的常量值(-128~127)推送至栈顶
- sipush 将一个短整型常量值(-32768~32767)推送至栈顶
- ldc 将int, float或String型常量值从常量池中推送至栈顶
- ldc_w 将int, float或String型常量值从常量池中推送至栈顶(宽索引)
- aconst_null 将null推送至栈顶
- iconst_m1 将int型-1推送至栈顶
- iconst_x 将int型x推送至栈顶,x范围:[0, 5]
- lconst_x 将long型x推送至栈顶,x范围:[0, 1]
- fconst_x 将float型x推送至栈顶,x范围:[0, 1]
- dconst_x 将double型x推送至栈顶,x范围:[0, 1]
将数组指定索引的数组推送至操作数栈(operand stack)
- iaload 将int型数组指定索引的值推送至栈顶
- laload 将long型数组指定索引的值推送至栈顶
- faload 将float型数组指定索引的值推送至栈顶
- daload 将double型数组指定索引的值推送至栈顶
- aaload 将引用型数组指定索引的值推送至栈顶
- baload 将boolean或byte型数组指定索引的值推送至栈顶
- caload 将char型数组指定索引的值推送至栈顶
- saload 将short型数组指定索引的值推送至栈顶
将操作数栈数存储到数组指定索引
- iastore 将栈顶int型数值存入指定数组的指定索引位置
- lastore 将栈顶long型数值存入指定数组的指定索引位置
- fastore 将栈顶float型数值存入指定数组的指定索引位置
- dastore 将栈顶double型数值存入指定数组的指定索引位置
- aastore 将栈顶引用型数值存入指定数组的指定索引位置
- bastore 将栈顶boolean或byte型数值存入指定数组的指定索引位置
- castore 将栈顶char型数值存入指定数组的指定索引位置
- sastore 将栈顶short型数值存入指定数组的指定索引位置
操作数栈其他相关
- pop 将栈顶数值弹出 (数值不能是long或double类型的)
- pop2 将栈顶的一个(long或double类型的)或两个数值弹出(其它)
- dup 复制栈顶数值并将复制值压入栈顶
- dup_x1 复制栈顶数值并将两个复制值压入栈顶
- dup_x2 复制栈顶数值并将三个(或两个)复制值压入栈顶
- dup2 复制栈顶一个(long或double类型的)或两个(其它)数值并将复制值压入栈顶
- dup2_x1 复制栈顶2个数值,并压入栈顶2次
- dup2_x2 复制栈顶2个数值,并压入栈顶3次
- swap 将栈最顶端的两个数值互换(数值不能是long或double类型的)
运算相关
- 加 iadd,ladd,fadd,dadd
- 减 is,ls,fs,ds
- 乘 imul,lmul,fmul,dmul
- 除 idiv,ldiv,fdiv,ddiv
- 余数 irem,lrem,frem,drem
- 取负 ineg,lneg,fneg,dneg
- 移位 ishl,lshr,iushr,lshl,lshr,lushr
- 按位或 ior,lor
- 按位与 iand,land
- 按位异或 ixor,lxor
- 类型转换 i2l,i2f,i2d,l2f,l2d,f2d(放宽数值转换);i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(缩窄数值转换)
条件转移
- 有条件转移 ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpene, if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne,lcmp,fcmpl,fcmpg,dcmpl,dcmpg
- 复合条件转移 tableswitch,lookupswitch
- 无条件转移 goto,goto_w,jsr,jsr_w,ret
类和数组
- 创建类 new
- 创建新数组 newarray,anewarray,multianwarray
- 访问类的域和类实例域 getfield,putfield,getstatic,putstatic
- 获取数组长度 arraylength
- 检相类实例或数组属性 instanceof,checkcast
其他指令
- 调度对象的实例方法 invokevirtual
- 调用由接口实现的方法 invokeinterface
- 调用需要特殊处理的实例方法 invokespecial
- 调用命名类中的静态方法 invokestatic
- 方法返回 ireturn,lreturn,freturn,dreturn,areturn,return
- 异常 athrow
- finally关键字的实现使用 jsr,jsr_w,ret
- synchronized锁 monitorenter,monitorexit
还没有评论,来说两句吧...