虚拟机字节码指令表(《深入理解Java虚拟机》第二版)
常量型
助记符 指令含义 nop 什么都不做 aconst_null 将null推送至栈顶 iconst_m1 将int型-1推送至栈顶 iconst_0 将int型0推送至栈顶 lconst_0 将long型0推送至栈顶 fconst_0 将float型0推送至栈顶 dconst_0 将double型0推送至栈顶 bipush 将单字节的常量值(-128~127)推送至栈顶 bspush 将一个短整型常量值(-32768~32767)推送至栈顶 ldc 将int,float,String型常量值从常量池中推送至栈顶 ldc_w 将int,float,String型常量值从常量池中推送至栈顶(宽索引) ldc2_w 将long,double型常量值从常量池中推送至栈顶(宽索引)
本地变量
助记符 指令含义 iload 将指定的int型本地变量推送至栈顶 lload 将指定的lnog型本地变量推送至栈顶 fload 将指定的float型本地变量推送至栈顶 dload 将指定的double型本地变量推送至栈顶 aload 将指定的引用类型本地变量推送至栈顶 iload_0 将第一个int型本地变量推送至栈顶(iload_1,iload_2分别表示第二个,第三个。。) iload_1 将第2个int型本地变量推送至栈顶 lload_0 将第一个long型本地变量推送至栈顶 lload_1 将第2个long型本地变量推送至栈顶 fload_0 将第一个float型本地变量推送至栈顶 dload_0 将第一个double型本地变量推送至栈顶 aload_0 将第一个引用类型本地变量推送至栈顶
数组变量类型
iaload 将int型数组指定索引的值推送至栈顶 laload 将long型数组指定索引的值推送至栈顶 faload 将float型数组指定索引的值推送至栈顶 daload 将double型数组指定索引的值推送至栈顶 aaload 将引用型数组指定索引的值推送至栈顶 baload 将boolean或byte型数组指定索引的值推送至栈顶 caload 将char型数组指定索引的值推送至栈顶 saload 将short型数组指定索引的值推送至栈顶
将值存入变量
istore 将栈顶int型数值存入指定变量 lstore 将栈顶long型数值存入指定变量 fstore 将栈顶float型数值存入指定变量 dstore 将栈顶double型数值存入指定变量 astore 将栈顶引用型数值存入指定变量 istore_0 将栈顶int型数值存入第一个变量 lstore_0 将栈顶long型数值存入第一个变量 fstore_0 将栈顶float型数值存入第一个变量 dstore_0 将栈顶double型数值存入第一个变量 astore_0 将栈顶引用型数值存入第一个变量
将值存入数组
iastore 将栈顶int型数值存入指定数组的指定索引位置 lastore 将栈顶long型数值存入指定数组的指定索引位置 fastore 将栈顶float型数值存入指定数组的指定索引位置 dastore 将栈顶double型数值存入指定数组的指定索引位置 aastore 将栈顶引用型数值存入指定数组的指定索引位置 bastore 将栈顶boolean型数值存入指定数组的指定索引位置 castore 将栈顶char型数值存入指定数组的指定索引位置 sastore 将栈顶short型数值存入指定数组的指定索引位置
将值弹出栈顶
pop 将栈顶数值弹出(不能是long或double类型) pop2 将栈顶的一个(对于long或double)或2个数值(对于非long或double的其他类型)弹出
复制栈顶数值指令
dup 复制栈顶数值并将复制值压入栈顶 dup_x1 复制栈顶数值并将2个复制值压入栈顶 dup_x2 复制栈顶数值并将3个(或2个)复制值压入栈顶 dup_2 复制栈顶一个(long或double)或2个(非long,double)数值并将复制值压入栈顶 dup2_x1 dup_x1指令的双倍版本 dup2_x2 dup_x2指令的双倍版本
交换指令
swap 将栈最顶端的2个数值互换(不能是long或double)
变量计算
加,减,乘,除,取模,取负数值,>>(右位移),>>>(无符号右移),<<(左位移),按位与(&),按位或(|),按位异或(^)
iadd 将栈顶2个int型数值相加并将结果压入栈顶 ladd 将栈顶2个long型数值相加并将结果压入栈顶 fadd 将栈顶2个float型数值相加并将结果压入栈顶 dadd 将栈顶2个double型数值相加并将结果压入栈顶 isub 将栈顶2个int型数值相减并将结果压入栈顶 fsub 将栈顶2个float型数值相减并将结果压入栈顶 lsub 将栈顶2个long型数值相减并将结果压入栈顶 dsub 将栈顶2个double型数值相减并将结果压入栈顶 imul 将栈顶2个int型数值相乘并将结果压入栈顶 lmul 将栈顶2个long型数值相乘并将结果压入栈顶 fmul 将栈顶2个float型数值相乘并将结果压入栈顶 dmul 将栈顶2个double型数值相乘并将结果压入栈顶 idiv 将栈顶2个int型数值相除并将结果压入栈顶 ldiv 将栈顶2个long型数值相除并将结果压入栈顶 fdiv 将栈顶2个float型数值相除并将结果压入栈顶 ddiv 将栈顶2个double型数值相除并将结果压入栈顶 irem 将栈顶2个int型数值作取模运算并将结果压入栈顶 lrem 将栈顶2个long型数值作取模运算并将结果压入栈顶 frem 将栈顶2个float型数值作取模运算并将结果压入栈顶 drem 将栈顶2个double型数值作取模运算并将结果压入栈顶 ineg 将int型数值取负数并将结果压入栈顶 lneg 将long型数值取负数并将结果压入栈顶 fneg 将float型数值取负数并将结果压入栈顶 dneg 将double型数值取负数并将结果压入栈顶 ishl 将int型数值左移(带符号)指定位数并将结果压入栈顶(其余类型类似) ishr 将int型数值右移(带符号)指定位数并将结果压入栈顶(其余类型类似) iushr 将int型数值右移(无符号)指定位数并将结果压入栈顶(其余类型类似) iand 将栈顶2个int型数值作 “按位与” 并将结果压入栈顶(其余类型类似) ior 将栈顶2个int型数值作 “按位或” 并将结果压入栈顶(其余类型类似) ixor 将栈顶2个int型数值作 “按位异或” 并将结果压入栈顶(其余类型类似)
变量增加指定值
iinc 将指定int型变量增加指定值(如i++,i–,i+=3等)
跳转指令
goto 无条件跳转 jsr 跳转至指定的16位offset位置,并将jsr的下一条指令地址压入栈中 ret 返回至本地变量指定的index的指令位置(一般jsr与jsr_w联合使用) tableswitch 用于switch条件跳转,case值连续(可变长度指令) lookupswitch 用于switch条件跳转,case值不连续(可变长度指令) ifnull 为null时跳转 ifnonull 不为null时跳转 goto_w 无跳转跳转(宽索引) jsr_w 跳转至指定的32位offset位置,并将jsr_w的下一条指定地址压入栈顶(宽索引)
返回指令
ireturn 从当前方法返回int lreturn 从当前方法返回long freturn 从当前方法返回float dreturn 从当前方法返回double areturn 从当前方法返回对象引用 return 从当前方法返回void
获值/赋值指令
getstatic 或企业指定类的静态域,并将值压入栈顶 putstatic 为指定的类的静态域赋值 getfield 获取指定类的实例域,并将值压入栈顶 putfield 未指定类的实例域赋值
调用方法指令
invokevirtual 调用实例方法 invokespecial 调用超类构造方法,实例初始化方法,私有方法 invokestatic 调用静态方法 invokeinterface 调用接口方法 invokedynamic 调用动态方法
创建对象指令
new 创建一个对象,并将值压入栈顶 newarray 创建一个原始类型数组 anewarray 创建一个引用类型的数组 arraylength 获取数组长度
异常指令
athrow 将栈顶异常抛出 checkcast 检验类型转换,检验未通过抛出ClassCastException
锁指令
monitorenter 获取对象的锁,用于同步方法或方法块 monitorexit 释放对象的锁,用于同步方法或方法块
未完待续。。。。