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