虚拟机字节码指令表(《深入理解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

释放对象的锁,用于同步方法或方法块

未完待续。。。。