# A.1 字节代码指令

本节对字节代码指令进行简要描述。如需全面描述,请参阅 Java 虚拟机规范。

约定:a 和 b 表示 int, float, long 或 double 值(比如,它们对于 IADD 表示 int,而对于 LADD 则表示 long),o 和 p 表示对象引用,v 表示任意值(或者,对于栈指令,表示大小为 1 的值),w 表示 long 或 double,i、j 和 n 表示 int 值。

局部变量

指令 之前的栈 之后的栈
ILOAD, LLOAD, FLOAD, DLOAD var ... ... , a
ALOAD var ... ... , o
ISTORE, LSTORE, FSTORE, DSTORE var ... , a ...
ASTORE var ... , o ...
IINC var incr ... ...

指令 之前的栈 之后的栈
POP ... , v ...
POP2 ... , v1 , v2 ...
POP2 ... , w ...
DUP ... , v ... , v , v
DUP2 ... , v1 , v2 ... , v1 , v2 , v1 , v2
DUP2 ... , w ... , w, w
SWAP ... , v1 , v2 ... , v2 , v1
DUP_X1 ... , v1 , v2 ... , v2 , v1 , v2
DUP_X2 ... , v1 , v2 , v3 ... , v3 , v1 , v2 , v3
DUP_X2 ... , w , v ... , v , w , v
DUP2_X1 ... , v1 , v2 , v3 ... , v2 , v3 , v1 , v2 , v3
DUP2_X1 ... , v , w ... , w , v , w
DUP2_X2 ... , v1 , v2 , v3 , v4 ... , v3 , v4 , v1 , v2 , v3 , v4
DUP2_X2 ... , w , v1 , v2 ... , v1 , v2 , w , v1 , v2
DUP2_X2 .... , v1 , v2 , w ... , w , v1 , v2 , w
DUP2_X2 ... , w1 , w2 ... , w2 , w1 , w2

常量

指令 之前的栈 之后的栈
ICONST_n (−1 _ n _ 5) ... ... , n
LCONST_n (0 _ n _ 1) ... ... , nL
FCONST_n (0 _ n _ 2) ... ... , nF
DCONST_n (0 _ n _ 1) ... ... , nD
BIPUSH b, −128 _ b < 127 ... ... , b
SIPUSH s, −32768 _ s < 32767 ... ... , s
LDC cst (int, float, long, double, String 或 Type) ... ... , cst
ACONST_NULL ... ... , null

算数与逻辑

指令 之前的栈 之后的栈
IADD, LADD, FADD, DADD ... , a , b ... , a + b
ISUB, LSUB, FSUB, DSUB ... , a , b ... , a - b
IMUL, LMUL, FMUL, DMUL ... , a , b ... , a * b
IDIV, LDIV, FDIV, DDIV ... , a , b ... , a / b
IREM, LREM, FREM, DREM ... , a , b ... , a % b
INEG, LNEG, FNEG, DNEG ... , a ... , -a
ISHL, LSHL ... , a , n ... , a <_< n
ISHR, LSHR ... , a , n ... , a >_> n
IUSHR, LUSHR ... , a , n ... , a >>> n
IAND, LAND ... , a , b ... , a & b
IOR, LOR ... , a , b ... , a
IXOR, LXOR ... , a , b ... , a ^ b
LCMP ... , a , b ... , a == b ? 0 : (a < b ? -1 : 1)
FCMPL, FCMPG ... , a , b ... , a == b ? 0 : (a < b ? -1 : 1)
DCMPL, DCMPG ... , a , b ... , a == b ? 0 : (a < b ? -1 : 1)

类型转换

指令 之前的栈 之后的栈
I2B ... , i ... , (byte) i
I2C ... , i ... , (char) i
I2S ... , i ... , (short) i
L2I, F2I, D2I ... , a ... , (int) a
I2L, F2L, D2L ... , a ... , (long) a
I2F, L2F, D2F ... , a ... , (float) a
I2D, L2D, F2D ... , a ... , (double) a
CHECKCAST class ... , o ... , (class) o

对象、字段和方法

指令 之前的栈 之后的栈
NEW class … …,new class
GETFIELD c f t ... , o ... , o.f
PUTFIELD c f t ... , o , v ...
GETSTATIC c f t ... ... , c.f
PUTSTATIC c f t ... , v ...
INVOKEVIRTUAL c m t ... , o , v1 , ... , vn ... , o.m(v1, ... vn)
INVOKESPECIAL c m t ... , o , v1 , ... , vn ... , o.m(v1, ... vn)
INVOKESTATIC c m t ... , v1 , ... , vn ... , c.m(v1, ... vn)
INVOKEINTERFACE c m t ... , o , v1 , ... , vn ... , o.m(v1, ... vn)
INVOKEDYNAMIC m t bsm ... , o , v1 , ... , vn ... , o.m(v1, ... vn)
INSTANCEOF class ... , o ... , o instanceof class
MONITORENTER ... , o ...
MONITOREXIT ... , o ...

数组

指令 之前的栈 之后的栈
NEWARRAY type (用于任意基元类型) ... , n ... , new type[n]
ANEWARRAY class ... , n ... , new class[n]
MULTIANEWARRAY [...[t n ... , i1 ,... , in ... , new t[i1]...[in]…
BALOAD, CALOAD, SALOAD ... , o , i ... , o[i]
IALOAD, LALOAD,FALOAD, DALOAD ... , o , i ... , o[i]
AALOAD ... , o , i ... , o[i]
BASTORE, CASTORE, SASTORE ... , o , i , j ...
IASTORE, LASTORE, FASTORE, DASTORE ... , o , i , a ...
AASTORE ... , o , i , p ...
ARRAYLENGTH ... , o ... , o.length

跳转

指令 之前的栈 之后的栈
IFEQ ... , i ... i == 0 时跳转
IFNE ... , i ... i != 0 时跳转
IFLT ... , i ... i < 0 时跳转
IFGE ... , i ... i >= 0 时跳转
IFGT ... , i ... i > 0 时跳转
IFLE ... , i ... i <= 0 时跳转
IF_ICMPEQ ... , i , j ... i == j 时跳转
IF_ICMPNE ... , i , j ... i != j 时跳转
IF_ICMPLT ... , i , j ... i < j 时跳转
IF_ICMPGE ... , i , j ... i >= j 时跳转
IF_ICMPGT ... , i , j ... i > j 时跳转
IF_ICMPLE ... , i , j ... i <= j 时跳转
IF_ACMPEQ ... , o , p ... o == p 时跳转
IF_ACMPNE ... , o , p ... o != p 时跳转
IFNULL ... , o ... o == null 时跳转
IFNONNULL ... , o ... o != null 时跳转
GOTO ... ... 总是跳转
TABLESWITCH ... , i ... 总是跳转
LOOKUPSWITCH ... , i ... 总是跳转

返回

指令 之前的栈
IRETURN, LRETURN, FRETURN, DRETURN ... , a
ARETURN ... , o
RETURN ...
ATHROW ... , o