ASM Opcodes

726 阅读7分钟
int LDC = 18;                  加载常量

int ILOAD = 21;                加载int类型的变量
int LLOAD = 22;                加载long类型的变量
int FLOAD = 23;                加载float类型的变量
int DLOAD = 24;                加载double类型的变量
int ALOAD = 25;                加载引用(object)类型的变量

int IALOAD = 46;               加载int[]类型的变量
int LALOAD = 47;               加载long[]类型的变量
int FALOAD = 48;               加载float[]类型的变量
int DALOAD = 49;               加载double[]类型的变量
int AALOAD = 50;               加载object[]类型的变量
int BALOAD = 51;               加载boolean[]类型的变量
int CALOAD = 52;               加载char[]类型的变量
int SALOAD = 53;               加载short[]类型的变量

int ISTORE = 54;               存储int类型变量
int LSTORE = 55;               存储long类型变量
int FSTORE = 56;               存储float类型变量
int DSTORE = 57;               存储double类型变量
int ASTORE = 58;               存储引用类型变量
int IASTORE = 79;              存储int[]类型变量
int LASTORE = 80;              存储long[]类型变量
int FASTORE = 81;              存储float[]类型变量
int DASTORE = 82;              存储double[]类型变量
int AASTORE = 83;              存储object[]类型变量
int BASTORE = 84;              存储boolean[]类型变量
int CASTORE = 85;              存储char[]类型变量
int SASTORE = 86;              存储short[]类型变量

//${X}ADD  将栈顶两X型数值相加并将结果压入栈顶
int IADD = 96; 
int LADD = 97;
int FADD = 98;
int DADD = 99;
//${X}SUB  将栈顶两X型数值相减并将结果压入栈顶
int ISUB = 100;
int LSUB = 101;
int FSUB = 102; 
int DSUB = 103; 
//${X}MUL  将栈顶两X型数值相乘并将结果压入栈顶
int IMUL = 104; // -
int LMUL = 105; // -
int FMUL = 106; // -
int DMUL = 107; // -
//${X}DIV  将栈顶两X型数值相除并将结果压入栈顶
int IDIV = 108; // -
int LDIV = 109; // -
int FDIV = 110; // -
int DDIV = 111; // -
//${X}REM  将栈顶两X型数值作取模运算并将结果压入栈顶
int IREM = 112; // -
int LREM = 113; // -
int FREM = 114; // -
int DREM = 115; // -
//${X}NEG  将栈顶X型数值取负并将结果压入栈顶
int INEG = 116; // -
int LNEG = 117; // -
int FNEG = 118; // -
int DNEG = 119; // -
//${X}SHL  将栈顶X型数值左移位指定位数并将结果压入栈顶
int ISHL = 120; // -
int LSHL = 121; // -
//${X}SHR  将栈顶X型数值右移位指定位数并将结果压入栈顶
int ISHR = 122; // -
int LSHR = 123; // -
//${X}USHR 将栈顶X型数值右(无符号)移位指定位数并将结果压入栈顶
int IUSHR = 124; // -
int LUSHR = 125; // -
//${X}AND  将栈顶两X型数值作“按位与”并将结果压入栈顶
int IAND = 126; // -
int LAND = 127; // -
//${X}OR   将栈顶两X型数值作“按位或”并将结果压入栈顶
int IOR = 128; // -
int LOR = 129; // -
//${X}XOR  将栈顶两X型数值作“按位异或”并将结果压入栈顶
int IXOR = 130; // -
int LXOR = 131; // -

int IINC = 132;           将指定int型变量增加指定值(i++,i--,i+=2)
int I2L = 133;            将栈顶int型数值强制转换成long型数值并将结果压入栈顶
int I2F = 134;            将栈顶int型数值强制转换成float型数值并将结果压入栈顶
int I2D = 135;            将栈顶int型数值强制转换成double型数值并将结果压入栈顶
int L2I = 136;            将栈顶long型数值强制转换成int型数值并将结果压入栈顶
int L2F = 137;            将栈顶long型数值强制转换成float型数值并将结果压入栈顶
int L2D = 138;            将栈顶long型数值强制转换成double型数值并将结果压入栈顶
int F2I = 139;            将栈顶float型数值强制转换成int型数值并将结果压入栈顶
int F2L = 140;            将栈顶float型数值强制转换成long型数值并将结果压入栈顶
int F2D = 141;            将栈顶float型数值强制转换成double型数值并将结果压入栈顶
int D2I = 142;            将栈顶double型数值强制转换成int型数值并将结果压入栈顶
int D2L = 143;            将栈顶double型数值强制转换成long型数值并将结果压入栈顶
int D2F = 144;            将栈顶double型数值强制转换成float型数值并将结果压入栈顶
int I2B = 145;            将栈顶int型数值强制转换成boolean型数值并将结果压入栈顶
int I2C = 146;            将栈顶int型数值强制转换成char型数值并将结果压入栈顶
int I2S = 147;            将栈顶int型数值强制转换成short型数值并将结果压入栈顶
int LCMP = 148;           比较栈顶两long型数值大小,并将结果(1,0,-1)压入栈顶
int FCMPL = 149;          比较栈顶两float型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶
int FCMPG = 150;          比较栈顶两float型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶
int DCMPL = 151;          比较栈顶两double型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶
int DCMPG = 152;          比较栈顶两double型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶
int IFEQ = 153;           当栈顶int型数值等于0时跳转
int IFNE = 154;           当栈顶int型数值不等于0时跳转
int IFLT = 155;           当栈顶int型数值小于0时跳转
int IFGE = 156;           当栈顶int型数值大于等于0时跳转
int IFGT = 157;           当栈顶int型数值大于0时跳转
int IFLE = 158;           当栈顶int型数值小于等于0时跳转
int IF_ICMPEQ = 159;      比较栈顶两int型数值大小,当结果不等于0时跳转
int IF_ICMPNE = 160;      比较栈顶两int型数值大小,当结果不等于0时跳转
int IF_ICMPLT = 161;      比较栈顶两int型数值大小,当结果小于0时跳转
int IF_ICMPGE = 162;      比较栈顶两int型数值大小,当结果大于等于0时跳转
int IF_ICMPGT = 163;      比较栈顶两int型数值大小,当结果大于0时跳转
int IF_ICMPLE = 164;      比较栈顶两int型数值大小,当结果小于等于0时跳转
int IF_ACMPEQ = 165;      比较栈顶两引用型数值,当结果相等时跳转
int IF_ACMPNE = 166;      比较栈顶两引用型数值,当结果不相等时跳转
int GOTO = 167;           无条件跳转
int JSR = 168;            跳转至指定16位offset位置,并将jsr下一条指令地址压入栈顶
int RET = 169;            返回至本地变量指定的index的指令位置(一般与jsr,jsr_w联合使用)
int TABLESWITCH = 170;    用于switch条件跳转,case值连续(可变长度指令)
int LOOKUPSWITCH = 171;   lookupswitch 用于switch条件跳转,case值不连续(可变长度指令)
int IRETURN = 172;        从当前方法返回int
int LRETURN = 173;        从当前方法返回long
int FRETURN = 174;        从当前方法返回float
int DRETURN = 175;        从当前方法返回double
int ARETURN = 176;        从当前方法返回object
int RETURN = 177;         从当前方法返回void
int GETSTATIC = 178;      获取指定类的静态域,并将其值压入栈顶
int PUTSTATIC = 179;      为指定的类的静态域赋值
int GETFIELD = 180;       获取指定类的实例域,并将其值压入栈顶
int PUTFIELD = 181;       为指定的类的实例域赋值
int INVOKEVIRTUAL = 182;  调用实例方法
int INVOKESPECIAL = 183;  调用超类构造方法,实例初始化方法,私有方法
int INVOKESTATIC = 184;   调用静态方法
int INVOKEINTERFACE = 185;调用接口方法
int INVOKEDYNAMIC = 186;  调用lambda动态方法
int NEW = 187;            创建一个对象,并将其引用值压入栈顶
int NEWARRAY = 188;       创建一个指定原始类型(如int,float,char…)的数组,并将其引用值压入栈顶
int ANEWARRAY = 189;      创建一个引用型(如类,接口,数组)的数组,并将其引用值压入栈顶
int ARRAYLENGTH = 190;    获得数组的长度值并压入栈顶
int ATHROW = 191;         将栈顶的异常抛出
int CHECKCAST = 192;      检验类型转换,检验未通过将抛出ClassCastException
int INSTANCEOF = 193;     检验对象是否是指定的类的实例,如果是将1压入栈顶,否则将0压入栈顶
int MONITORENTER = 194;   获得对象的锁,用于同步方法或同步块
int MONITOREXIT = 195;    释放对象的锁,用于同步方法或同步块
int MULTIANEWARRAY = 197; 创建指定类型和指定维度的多维数组(执行该指令时,操作栈中必须包含各维度的长度值),并将其引用值压入栈顶
int IFNULL = 198;         为null时跳转
int IFNONNULL = 199;      不为null时跳转