JVM字节码指令表

       虚拟机字节码指令表(《深入理解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_x1dup_x1指令的双倍版本
dup2_x2dup_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释放对象的锁,用于同步方法或方法块

未完待续。。。。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值