JVM字节码指令表

       虚拟机字节码指令表(《深入理解Java虚拟机》第二版)

JVM指令表

    • 常量型
    • 本地变量
    • 数组变量类型
    • 将值存入变量
    • 将值存入数组
    • 将值弹出栈顶
    • 复制栈顶数值指令
    • 交换指令
    • 变量计算
    • 变量增加指定值
    • 跳转指令
    • 返回指令
    • 获值/赋值指令
    • 调用方法指令
    • 创建对象指令
    • 异常指令
    • 锁指令

常量型

助记符 指令含义
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 释放对象的锁,用于同步方法或方法块

未完待续。。。。

你可能感兴趣的:(JavaSE,JVM,指令表)