# 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 | 

