Java字节码指令大全

简介: Java字节码指令大全

一、Java字节码指令大全

1.1.常量入栈指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x01 aconst_null null值入栈。
0x02 iconst_m1 -1(int)值入栈。
0x03 iconst_0 0(int)值入栈。
0x04 iconst_1 1(int)值入栈。
0x05 iconst_2 2(int)值入栈。
0x06 iconst_3 3(int)值入栈。
0x07 iconst_4 4(int)值入栈。
0x08 iconst_5 5(int)值入栈。
0x09 lconst_0 0(long)值入栈。
0x0a lconst_1 1(long)值入栈。
0x0b fconst_0 0(float)值入栈。
0x0c fconst_1 1(float)值入栈。
0x0d fconst_2 2(float)值入栈。
0x0e dconst_0 0(double)值入栈。
0x0f dconst_1 1(double)值入栈。
0x10 bipush valuebyte valuebyte值带符号扩展成int值入栈。
0x11 sipush valuebyte1valuebyte2 (valuebyte1 << 8) | valuebyte2 值带符号扩展成int值入栈。
0x12 ldc indexbyte1 常量池中的常量值(int, float, string reference, object reference)入栈。
0x13 ldc_w indexbyte1indexbyte2 常量池中常量(int, float, string reference, object reference)入栈。
0x14 ldc2_w indexbyte1indexbyte2 常量池中常量(long, double)入栈。

1.2.局部变量值转载到栈中指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x19 (wide)aload indexbyte 从局部变量indexbyte中装载引用类型值入栈。
0x2a aload_0 从局部变量0中装载引用类型值入栈。
0x2b aload_1 从局部变量1中装载引用类型值入栈。
0x2c aload_2 从局部变量2中装载引用类型值入栈。
0x2d aload_3 从局部变量3中装载引用类型值入栈。
0x15 (wide)iload indexbyte 从局部变量indexbyte中装载int类型值入栈。
0x1a iload_0 从局部变量0中装载int类型值入栈。
0x1b iload_1 从局部变量1中装载int类型值入栈。
0x1c iload_2 从局部变量2中装载int类型值入栈。
0x1d iload_3 从局部变量3中装载int类型值入栈。
0x16 (wide)lload indexbyte 从局部变量indexbyte中装载long类型值入栈。
0x1e lload_0 从局部变量0中装载int类型值入栈。
0x1f lload_1 从局部变量1中装载int类型值入栈。
0x20 lload_2 从局部变量2中装载int类型值入栈。
0x21 lload_3 从局部变量3中装载int类型值入栈。
0x17 (wide)fload indexbyte 从局部变量indexbyte中装载float类型值入栈。
0x22 fload_0 从局部变量0中装载float类型值入栈。
0x23 fload_1 从局部变量1中装载float类型值入栈。
0x24 fload_2 从局部变量2中装载float类型值入栈。
0x25 fload_3 从局部变量3中装载float类型值入栈。
0x18 (wide)dload indexbyte 从局部变量indexbyte中装载double类型值入栈。
0x26 dload_0 从局部变量0中装载double类型值入栈。
0x27 dload_1 从局部变量1中装载double类型值入栈。
0x28 dload_2 从局部变量2中装载double类型值入栈。
0x29 dload_3 从局部变量3中装载double类型值入栈。
0x32 aaload 从引用类型数组中装载指定项的值。
0x2e iaload 从int类型数组中装载指定项的值。
0x2f laload 从long类型数组中装载指定项的值。
0x30 faload 从float类型数组中装载指定项的值。
0x31 daload 从double类型数组中装载指定项的值。
0x33 baload 从boolean类型数组或byte类型数组中装载指定项的值(先转换为int类型值,后压栈)。
0x34 caload 从char类型数组中装载指定项的值(先转换为int类型值,后压栈)。
0x35 saload 从short类型数组中装载指定项的值(先转换为int类型值,后压栈)。

1.3.将栈顶值保存到局部变量中指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x3a (wide)astore indexbyte 将栈顶引用类型值保存到局部变量indexbyte中。
0x4b astroe_0 将栈顶引用类型值保存到局部变量0中。
0x4c astore_1 将栈顶引用类型值保存到局部变量1中。
0x4d astore_2 将栈顶引用类型值保存到局部变量2中。
0x4e astore_3 将栈顶引用类型值保存到局部变量3中。
0x36 (wide)istore indexbyte 将栈顶int类型值保存到局部变量indexbyte中。
0x3b istore_0 将栈顶int类型值保存到局部变量0中。
0x3c istore_1 将栈顶int类型值保存到局部变量1中。
0x3d istore_2 将栈顶int类型值保存到局部变量2中。
0x3e istore_3 将栈顶int类型值保存到局部变量3中。
0x37 (wide)lstore indexbyte 将栈顶long类型值保存到局部变量indexbyte中。
0x3f lstore_0 将栈顶long类型值保存到局部变量0中。
0x40 lstore_1 将栈顶long类型值保存到局部变量1中。
0x41 lstore_2 将栈顶long类型值保存到局部变量2中。
0x42 lstroe_3 将栈顶long类型值保存到局部变量3中。
0x38 (wide)fstore indexbyte 将栈顶float类型值保存到局部变量indexbyte中。
0x43 fstore_0 将栈顶float类型值保存到局部变量0中。
0x44 fstore_1 将栈顶float类型值保存到局部变量1中。
0x45 fstore_2 将栈顶float类型值保存到局部变量2中。
0x46 fstore_3 将栈顶float类型值保存到局部变量3中。
0x39 (wide)dstore indexbyte 将栈顶double类型值保存到局部变量indexbyte中。
0x47 dstore_0 将栈顶double类型值保存到局部变量0中。
0x48 dstore_1 将栈顶double类型值保存到局部变量1中。
0x49 dstore_2 将栈顶double类型值保存到局部变量2中。
0x4a dstore_3 将栈顶double类型值保存到局部变量3中。
0x53 aastore 将栈顶引用类型值保存到指定引用类型数组的指定项。
0x4f iastore 将栈顶int类型值保存到指定int类型数组的指定项。
0x50 lastore 将栈顶long类型值保存到指定long类型数组的指定项。
0x51 fastore 将栈顶float类型值保存到指定float类型数组的指定项。
0x52 dastore 将栈顶double类型值保存到指定double类型数组的指定项。
0x54 bastroe 将栈顶boolean类型值或byte类型值保存到指定boolean类型数组或byte类型数组的指定项。
0x55 castore 将栈顶char类型值保存到指定char类型数组的指定项。
0x56 sastore 将栈顶short类型值保存到指定short类型数组的指定项。

1.4.wide指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xc4 wide 使用附加字节扩展局部变量索引(iinc指令特殊)。

1.5.通用(无类型)栈操作指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x00 nop 空操作。
0x57 pop 从栈顶弹出一个字长的数据。
0x58 pop2 从栈顶弹出两个字长的数据。
0x59 dup 复制栈顶一个字长的数据,将复制后的数据压栈。
0x5a dup_x1 复制栈顶一个字长的数据,弹出栈顶两个字长数据,先将复制后的数据压栈,再将弹出的两个字长数据压栈。
0x5b dup_x2 复制栈顶一个字长的数据,弹出栈顶三个字长的数据,将复制后的数据压栈,再将弹出的三个字长的数据压栈。
0x5c dup2 复制栈顶两个字长的数据,将复制后的两个字长的数据压栈。
0x5d dup2_x1 复制栈顶两个字长的数据,弹出栈顶三个字长的数据,将复制后的两个字长的数据压栈,再将弹出的三个字长的数据压栈。
0x5e dup2_x2 复制栈顶两个字长的数据,弹出栈顶四个字长的数据,将复制后的两个字长的数据压栈,再将弹出的四个字长的数据压栈。
0x5f swap 交换栈顶两个字长的数据的位置。Java指令中没有提供以两个字长为单位的交换指令。

1.7.类型转换指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x86 i2f 将栈顶int类型值转换为float类型值。
0x85 i2l 将栈顶int类型值转换为long类型值。
0x87 i2d 将栈顶int类型值转换为double类型值。
0x8b f2i 将栈顶float类型值转换为int类型值。
0x8c f2l 将栈顶float类型值转换为long类型值。
0x8d f2d 将栈顶float类型值转换为double类型值。
0x88 l2i 将栈顶long类型值转换为int类型值。
0x89 l2f 将栈顶long类型值转换为float类型值。
0x8a l2d 将栈顶long类型值转换double类型值。
0x8e d2i 将栈顶double类型值转换为int类型值。
0x90 d2f 将栈顶double类型值转换为float类型值。
0x8f d2l 将栈顶double类型值转换为long类型值。
0x91 i2b 将栈顶int类型值截断成byte类型,后带符号扩展成int类型值入栈。
0x92 i2c 将栈顶int类型值截断成char类型值,后带符号扩展成int类型值入栈。
0x93 i2s 将栈顶int类型值截断成short类型值,后带符号扩展成int类型值入栈。

1.8.整数运算

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x60 iadd 将栈顶两int类型数相加,结果入栈。
0x64 isub 将栈顶两int类型数相减,结果入栈。
0x68 imul 将栈顶两int类型数相乘,结果入栈。
0x6c idiv 将栈顶两int类型数相除,结果入栈。
0x70 irem 将栈顶两int类型数取模,结果入栈。
0x74 ineg 将栈顶int类型值取负,结果入栈。
0x61 ladd 将栈顶两long类型数相加,结果入栈。
0x65 lsub 将栈顶两long类型数相减,结果入栈。
0x69 lmul 将栈顶两long类型数相乘,结果入栈。
0x6d ldiv 将栈顶两long类型数相除,结果入栈。
0x71 lrem 将栈顶两long类型数取模,结果入栈。
0x75 lneg 将栈顶long类型值取负,结果入栈。
0x84 (wide)iinc indexbyteconstbyte 将整数值constbyte加到indexbyte指定的int类型的局部变量中。

1.9.浮点运算

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x62 fadd 将栈顶两float类型数相加,结果入栈。
0x66 fsub 将栈顶两float类型数相减,结果入栈。
0x6a fmul 将栈顶两float类型数相乘,结果入栈。
0x6e fdiv 将栈顶两float类型数相除,结果入栈。
0x72 frem 将栈顶两float类型数取模,结果入栈。
0x76 fneg 将栈顶float类型值取反,结果入栈。
0x63 dadd 将栈顶两double类型数相加,结果入栈。
0x67 dsub 将栈顶两double类型数相减,结果入栈。
0x6b dmul 将栈顶两double类型数相乘,结果入栈。
0x6f ddiv 将栈顶两double类型数相除,结果入栈。
0x73 drem 将栈顶两double类型数取模,结果入栈。
0x77 dneg 将栈顶double类型值取负,结果入栈。

1.10.逻辑运算——移位运算

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x78 ishl 左移int类型值。
0x79 lshl 左移long类型值。
0x7a ishr 算术右移int类型值。
0x7b lshr 算术右移long类型值。
0x7c iushr 逻辑右移int类型值。
0x7d lushr 逻辑右移long类型值。

1.11.逻辑运算——按位布尔运算

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x73 iand 对int类型按位与运算。
0x7f land 对long类型的按位与运算。
0x80 ior 对int类型的按位或运算。
0x81 lor 对long类型的按位或运算。
0x82 ixor 对int类型的按位异或运算。
0x83 lxor 对long类型的按位异或运算。

1.12.控制流指令——条件跳转指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x99 ifeq branchbyte1branchbyte2 若栈顶int类型值为0则跳转。
0x9a ifne branchbyte1branchbyte2 若栈顶int类型值不为0则跳转。
0x9b iflt branchbyte1branchbyte2 若栈顶int类型值小于0则跳转。
0x9e ifle branchbyte1branchbyte2 若栈顶int类型值小于等于0则跳转。
0x9d ifgt branchbyte1branchbyte2 若栈顶int类型值大于0则跳转。
0x9c ifge branchbyte1branchbyte2 若栈顶int类型值大于等于0则跳转。
0x9f if_icmpeq branchbyte1branchbyte2 若栈顶两int类型值相等则跳转。
0xa0 if_icmpne branchbyte1branchbyte2 若栈顶两int类型值不相等则跳转。
0xa1 if_icmplt branchbyte1branchbyte2 若栈顶两int类型值前小于后则跳转。
0xa4 if_icmple branchbyte1branchbyte2 若栈顶两int类型值前小于等于后则跳转。
0xa3 if_icmpgt branchbyte1branchbyte2 若栈顶两int类型值前大于后则跳转。
0xa2 if_icmpge branchbyte1branchbyte2 若栈顶两int类型值前大于等于后则跳转。
0xc6 ifnull branchbyte1branchbyte2 若栈顶引用值为null则跳转。
0xc7 ifnonnull branchbyte1branchbyte2 若栈顶引用值不为null则跳转。
0xa5 if_acmpeq branchbyte1branchbyte2 若栈顶两引用类型值相等则跳转。
0xa6 if_acmpne branchbyte1branchbyte2 若栈顶两引用类型值不相等则跳转。

1.13.控制流指令——比较指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0x94 lcmp 比较栈顶两long类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈。
0x95 fcmpl 比较栈顶两float类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。
0x96 fcmpg 比较栈顶两float类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。
0x97 dcmpl 比较栈顶两double类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。
0x98 dcmpg 比较栈顶两double类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

1.14.控制流指令——无条件跳转指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xa7 goto branchbyte1branchbyte2 无条件跳转到指定位置。
0xc8 goto_w branchbyte1branchbyte2branchbyte3branchbyte4 无条件跳转到指定位置(宽索引)。

1.15.对象操作指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xbb new indexbyte1indexbyte2 创建新的对象实例。
0xc0 checkcast indexbyte1indexbyte 类型强转。
0xc1 instanceof indexbyte1indexbyte2 判断类型。
0xb4 getfield indexbyte1indexbyte2 获取对象字段的值。
0xb5 putfield indexbyte1indexbyte2 给对象字段赋值。
0xb2 getstatic indexbyte1indexbyte2 获取静态字段的值。
0xb3 putstatic indexbyte1indexbyte2 给静态字段赋值。

1.16.数组操作指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xbc newarray atype 创建type类型的数组。
0xbd anewarray indexbyte1indexbyte2 创建引用类型的数组。
0xbe arraylength 获取一维数组的长度。
0xc5 multianewarray indexbyte1indexbyte2dimension 创建dimension维度的数组。

1.17.方法调用指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xb7 invokespecial indexbyte1indexbyte2 编译时方法绑定调用方法。
0xb6 invokevirtual indexbyte1indexbyte2 运行时方法绑定调用方法。
0xb8 invokestatic indexbyte1indexbyte2 调用静态方法。
0xb9 invokeinterface indexbyte1indexbyte2count0 调用接口方法。

1.18.方法返回指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xac ireturn 返回int类型值。
0xad lreturn 返回long类型值。
0xae freturn 返回float类型值。
0xaf dreturn 返回double类型值。
0xb0 areturn 返回引用类型值。
0xb1 return void函数返回。

1.19.线程同步指令

指令码 操作码(助记符) 操作数 描述(栈指操作数栈)
0xc2 monitorenter 进入并获得对象监视器。
0xc3 monitorexit 释放并退出对象监视器。

JAVA虚拟机所支持的指令集

这是oracle官方提供的java虚拟机指令集操作码与助记符的映射图,按类型进行了划分

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-7.html

Table 7.1.

Constants Loads Stores

00 (0x00)    nop

01 (0x01)    aconst_null

02 (0x02)    iconst_m1

03 (0x03)    iconst_0

04 (0x04)    iconst_1

05 (0x05)    iconst_2

06 (0x06)    iconst_3

07 (0x07)    iconst_4

08 (0x08)    iconst_5

09 (0x09)    lconst_0

10 (0x0a)    lconst_1

11 (0x0b)    fconst_0

12 (0x0c)    fconst_1

13 (0x0d)    fconst_2

14 (0x0e)    dconst_0

15 (0x0f)    dconst_1

16 (0x10)    bipush

17 (0x11)    sipush

18 (0x12)    ldc

19 (0x13)    ldc_w

20 (0x14)    ldc2_w

      

21 (0x15)    iload

22 (0x16)    lload

23 (0x17)    fload

24 (0x18)    dload

25 (0x19)    aload

26 (0x1a)    iload_0

27 (0x1b)    iload_1

28 (0x1c)    iload_2

29 (0x1d)    iload_3

30 (0x1e)    lload_0

31 (0x1f)    lload_1

32 (0x20)    lload_2

33 (0x21)    lload_3

34 (0x22)    fload_0

35 (0x23)    fload_1

36 (0x24)    fload_2

37 (0x25)    fload_3

38 (0x26)    dload_0

39 (0x27)    dload_1

40 (0x28)    dload_2

41 (0x29)    dload_3

42 (0x2a)    aload_0

43 (0x2b)    aload_1

44 (0x2c)    aload_2

45 (0x2d)    aload_3

46 (0x2e)    iaload

47 (0x2f)    laload

48 (0x30)    faload

49 (0x31)    daload

50 (0x32)    aaload

51 (0x33)    baload

52 (0x34)    caload

53 (0x35)    saload

      

54 (0x36)    istore

55 (0x37)    lstore

56 (0x38)    fstore

57 (0x39)    dstore

58 (0x3a)    astore

59 (0x3b)    istore_0

60 (0x3c)    istore_1

61 (0x3d)    istore_2

62 (0x3e)    istore_3

63 (0x3f)    lstore_0

64 (0x40)    lstore_1

65 (0x41)    lstore_2

66 (0x42)    lstore_3

67 (0x43)    fstore_0

68 (0x44)    fstore_1

69 (0x45)    fstore_2

70 (0x46)    fstore_3

71 (0x47)    dstore_0

72 (0x48)    dstore_1

73 (0x49)    dstore_2

74 (0x4a)    dstore_3

75 (0x4b)    astore_0

76 (0x4c)    astore_1

77 (0x4d)    astore_2

78 (0x4e)    astore_3

79 (0x4f)    iastore

80 (0x50)    lastore

81 (0x51)    fastore

82 (0x52)    dastore

83 (0x53)    aastore

84 (0x54)    bastore

85 (0x55)    castore

86 (0x56)    sastore

      

Table 7.2.

Stack Math Conversions

87 (0x57)    pop

88 (0x58)    pop2

89 (0x59)    dup

90 (0x5a)    dup_x1

91 (0x5b)    dup_x2

92 (0x5c)    dup2

93 (0x5d)    dup2_x1

94 (0x5e)    dup2_x2

95 (0x5f)    swap

      

 96 (0x60)    iadd

 97 (0x61)    ladd

 98 (0x62)    fadd

 99 (0x63)    dadd

100 (0x64)    isub

101 (0x65)    lsub

102 (0x66)    fsub

103 (0x67)    dsub

104 (0x68)    imul

105 (0x69)    lmul

106 (0x6a)    fmul

107 (0x6b)    dmul

108 (0x6c)    idiv

109 (0x6d)    ldiv

110 (0x6e)    fdiv

111 (0x6f)    ddiv

112 (0x70)    irem

113 (0x71)    lrem

114 (0x72)    frem

115 (0x73)    drem

116 (0x74)    ineg

117 (0x75)    lneg

118 (0x76)    fneg

119 (0x77)    dneg

120 (0x78)    ishl

121 (0x79)    lshl

122 (0x7a)    ishr

123 (0x7b)    lshr

124 (0x7c)    iushr

125 (0x7d)    lushr

126 (0x7e)    iand

127 (0x7f)    land

128 (0x80)    ior

129 (0x81)    lor

130 (0x82)    ixor

131 (0x83)    lxor

132 (0x84)    iinc

      

133 (0x85)    i2l

134 (0x86)    i2f

135 (0x87)    i2d

136 (0x88)    l2i

137 (0x89)    l2f

138 (0x8a)    l2d

139 (0x8b)    f2i

140 (0x8c)    f2l

141 (0x8d)    f2d

142 (0x8e)    d2i

143 (0x8f)    d2l

144 (0x90)    d2f

145 (0x91)    i2b

146 (0x92)    i2c

147 (0x93)    i2s

      

Table 7.3.

Table 7.4. 

Comparisons

148 (0x94)    lcmp

149 (0x95)    fcmpl

150 (0x96)    fcmpg

151 (0x97)    dcmpl

152 (0x98)    dcmpg

153 (0x99)    ifeq

154 (0x9a)    ifne

155 (0x9b)    iflt

156 (0x9c)    ifge

157 (0x9d)    ifgt

158 (0x9e)    ifle

159 (0x9f)    if_icmpeq

160 (0xa0)    if_icmpne

161 (0xa1)    if_icmplt

162 (0xa2)    if_icmpge

163 (0xa3)    if_icmpgt

164 (0xa4)    if_icmple

165 (0xa5)    if_acmpeq

166 (0xa6)    if_acmpne

      

Control

167 (0xa7)    goto

168 (0xa8)    jsr

169 (0xa9)    ret

170 (0xaa)    tableswitch

171 (0xab)    lookupswitch

172 (0xac)    ireturn

173 (0xad)    lreturn

174 (0xae)    freturn

175 (0xaf)    dreturn

176 (0xb0)    areturn

177 (0xb1)    return

      

Table 7.5. 

References

178 (0xb2)    getstatic

179 (0xb3)    putstatic

180 (0xb4)    getfield

181 (0xb5)    putfield

182 (0xb6)    invokevirtual

183 (0xb7)    invokespecial

184 (0xb8)    invokestatic

185 (0xb9)    invokeinterface

186 (0xba)    invokedynamic

187 (0xbb)    new

188 (0xbc)    newarray

189 (0xbd)    anewarray

190 (0xbe)    arraylength

191 (0xbf)    athrow

192 (0xc0)    checkcast

193 (0xc1)    instanceof

194 (0xc2)    monitorenter

195 (0xc3)    monitorexit

      

Extended

196 (0xc4)    wide

197 (0xc5)    multianewarray

198 (0xc6)    ifnull

199 (0xc7)    ifnonnull

200 (0xc8)    goto_w

201 (0xc9)    jsr_w

      

Reserved

202 (0xca)    breakpoint

254 (0xfe)    impdep1

255 (0xff)    impdep2

      

 


Java字节码指令大全

常量入栈指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x01

aconst_null

null值入栈。

0x02

iconst_m1

-1(int)值入栈。

0x03

iconst_0

0(int)值入栈。

0x04

iconst_1

1(int)值入栈。

0x05

iconst_2

2(int)值入栈。

0x06

iconst_3

3(int)值入栈。

0x07

iconst_4

4(int)值入栈。

0x08

iconst_5

5(int)值入栈。

0x09

lconst_0

0(long)值入栈。

0x0a

lconst_1

1(long)值入栈。

0x0b

fconst_0

0(float)值入栈。

0x0c

fconst_1

1(float)值入栈。

0x0d

fconst_2

2(float)值入栈。

0x0e

dconst_0

0(double)值入栈。

0x0f

dconst_1

1(double)值入栈。

0x10

bipush

valuebyte

valuebyte值带符号扩展成int值入栈。

0x11

sipush

valuebyte1

valuebyte2

(valuebyte1 << 8) | valuebyte2 值带符号扩展成int值入栈。

0x12

ldc

indexbyte1

常量池中的常量值(int, float, string reference, object reference)入栈。

0x13

ldc_w

indexbyte1

indexbyte2

常量池中常量(int, float, string reference, object reference)入栈。

0x14

ldc2_w

indexbyte1

indexbyte2

常量池中常量(long, double)入栈。

局部变量值转载到栈中指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x19

(wide)aload

indexbyte

从局部变量indexbyte中装载引用类型值入栈。

0x2a

aload_0

从局部变量0中装载引用类型值入栈。

0x2b

aload_1

从局部变量1中装载引用类型值入栈。

0x2c

aload_2

从局部变量2中装载引用类型值入栈。

0x2d

aload_3

从局部变量3中装载引用类型值入栈。

0x15

(wide)iload

indexbyte

从局部变量indexbyte中装载int类型值入栈。

0x1a

iload_0

从局部变量0中装载int类型值入栈。

0x1b

iload_1

从局部变量1中装载int类型值入栈。

0x1c

iload_2

从局部变量2中装载int类型值入栈。

0x1d

iload_3

从局部变量3中装载int类型值入栈。

0x16

(wide)lload

indexbyte

从局部变量indexbyte中装载long类型值入栈。

0x1e

lload_0

从局部变量0中装载int类型值入栈。

0x1f

lload_1

从局部变量1中装载int类型值入栈。

0x20

lload_2

从局部变量2中装载int类型值入栈。

0x21

lload_3

从局部变量3中装载int类型值入栈。

0x17

(wide)fload

indexbyte

从局部变量indexbyte中装载float类型值入栈。

0x22

fload_0

从局部变量0中装载float类型值入栈。

0x23

fload_1

从局部变量1中装载float类型值入栈。

0x24

fload_2

从局部变量2中装载float类型值入栈。

0x25

fload_3

从局部变量3中装载float类型值入栈。

0x18

(wide)dload

indexbyte

从局部变量indexbyte中装载double类型值入栈。

0x26

dload_0

从局部变量0中装载double类型值入栈。

0x27

dload_1

从局部变量1中装载double类型值入栈。

0x28

dload_2

从局部变量2中装载double类型值入栈。

0x29

dload_3

从局部变量3中装载double类型值入栈。

0x32

aaload

从引用类型数组中装载指定项的值。

0x2e

iaload

从int类型数组中装载指定项的值。

0x2f

laload

从long类型数组中装载指定项的值。

0x30

faload

从float类型数组中装载指定项的值。

0x31

daload

从double类型数组中装载指定项的值。

0x33

baload

从boolean类型数组或byte类型数组中装载指定项的值(先转换为int类型值,后压栈)。

0x34

caload

从char类型数组中装载指定项的值(先转换为int类型值,后压栈)。

0x35

saload

从short类型数组中装载指定项的值(先转换为int类型值,后压栈)。

将栈顶值保存到局部变量中指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x3a

(wide)astore

indexbyte

将栈顶引用类型值保存到局部变量indexbyte中。

0x4b

astroe_0

将栈顶引用类型值保存到局部变量0中。

0x4c

astore_1

将栈顶引用类型值保存到局部变量1中。

0x4d

astore_2

将栈顶引用类型值保存到局部变量2中。

0x4e

astore_3

将栈顶引用类型值保存到局部变量3中。

0x36

(wide)istore

indexbyte

将栈顶int类型值保存到局部变量indexbyte中。

0x3b

istore_0

将栈顶int类型值保存到局部变量0中。

0x3c

istore_1

将栈顶int类型值保存到局部变量1中。

0x3d

istore_2

将栈顶int类型值保存到局部变量2中。

0x3e

istore_3

将栈顶int类型值保存到局部变量3中。

0x37

(wide)lstore

indexbyte

将栈顶long类型值保存到局部变量indexbyte中。

0x3f

lstore_0

将栈顶long类型值保存到局部变量0中。

0x40

lstore_1

将栈顶long类型值保存到局部变量1中。

0x41

lstore_2

将栈顶long类型值保存到局部变量2中。

0x42

lstroe_3

将栈顶long类型值保存到局部变量3中。

0x38

(wide)fstore

indexbyte

将栈顶float类型值保存到局部变量indexbyte中。

0x43

fstore_0

将栈顶float类型值保存到局部变量0中。

0x44

fstore_1

将栈顶float类型值保存到局部变量1中。

0x45

fstore_2

将栈顶float类型值保存到局部变量2中。

0x46

fstore_3

将栈顶float类型值保存到局部变量3中。

0x39

(wide)dstore

indexbyte

将栈顶double类型值保存到局部变量indexbyte中。

0x47

dstore_0

将栈顶double类型值保存到局部变量0中。

0x48

dstore_1

将栈顶double类型值保存到局部变量1中。

0x49

dstore_2

将栈顶double类型值保存到局部变量2中。

0x4a

dstore_3

将栈顶double类型值保存到局部变量3中。

0x53

aastore

将栈顶引用类型值保存到指定引用类型数组的指定项。

0x4f

iastore

将栈顶int类型值保存到指定int类型数组的指定项。

0x50

lastore

将栈顶long类型值保存到指定long类型数组的指定项。

0x51

fastore

将栈顶float类型值保存到指定float类型数组的指定项。

0x52

dastore

将栈顶double类型值保存到指定double类型数组的指定项。

0x54

bastroe

将栈顶boolean类型值或byte类型值保存到指定boolean类型数组或byte类型数组的指定项。

0x55

castore

将栈顶char类型值保存到指定char类型数组的指定项。

0x56

sastore

将栈顶short类型值保存到指定short类型数组的指定项。

wide指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0xc4

wide

使用附加字节扩展局部变量索引(iinc指令特殊)。

通用(无类型)栈操作指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x00

nop

空操作。

0x57

pop

从栈顶弹出一个字长的数据。

0x58

pop2

从栈顶弹出两个字长的数据。

0x59

dup

复制栈顶一个字长的数据,将复制后的数据压栈。

0x5a

dup_x1

复制栈顶一个字长的数据,弹出栈顶两个字长数据,先将复制后的数据压栈,再将弹出的两个字长数据压栈。

0x5b

dup_x2

复制栈顶一个字长的数据,弹出栈顶三个字长的数据,将复制后的数据压栈,再将弹出的三个字长的数据压栈。

0x5c

dup2

复制栈顶两个字长的数据,将复制后的两个字长的数据压栈。

0x5d

dup2_x1

复制栈顶两个字长的数据,弹出栈顶三个字长的数据,将复制后的两个字长的数据压栈,再将弹出的三个字长的数据压栈。

0x5e

dup2_x2

复制栈顶两个字长的数据,弹出栈顶四个字长的数据,将复制后的两个字长的数据压栈,再将弹出的四个字长的数据压栈。

0x5f

swap

交换栈顶两个字长的数据的位置。Java指令中没有提供以两个字长为单位的交换指令。

类型转换指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x86

i2f

将栈顶int类型值转换为float类型值。

0x85

i2l

将栈顶int类型值转换为long类型值。

0x87

i2d

将栈顶int类型值转换为double类型值。

0x8b

f2i

将栈顶float类型值转换为int类型值。

0x8c

f2l

将栈顶float类型值转换为long类型值。

0x8d

f2d

将栈顶float类型值转换为double类型值。

0x88

l2i

将栈顶long类型值转换为int类型值。

0x89

l2f

将栈顶long类型值转换为float类型值。

0x8a

l2d

将栈顶long类型值转换double类型值。

0x8e

d2i

将栈顶double类型值转换为int类型值。

0x90

d2f

将栈顶double类型值转换为float类型值。

0x8f

d2l

将栈顶double类型值转换为long类型值。

0x91

i2b

将栈顶int类型值截断成byte类型,后带符号扩展成int类型值入栈。

0x92

i2c

将栈顶int类型值截断成char类型值,后带符号扩展成int类型值入栈。

0x93

i2s

将栈顶int类型值截断成short类型值,后带符号扩展成int类型值入栈。

整数运算

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x60

iadd

将栈顶两int类型数相加,结果入栈。

0x64

isub

将栈顶两int类型数相减,结果入栈。

0x68

imul

将栈顶两int类型数相乘,结果入栈。

0x6c

idiv

将栈顶两int类型数相除,结果入栈。

0x70

irem

将栈顶两int类型数取模,结果入栈。

0x74

ineg

将栈顶int类型值取负,结果入栈。

0x61

ladd

将栈顶两long类型数相加,结果入栈。

0x65

lsub

将栈顶两long类型数相减,结果入栈。

0x69

lmul

将栈顶两long类型数相乘,结果入栈。

0x6d

ldiv

将栈顶两long类型数相除,结果入栈。

0x71

lrem

将栈顶两long类型数取模,结果入栈。

0x75

lneg

将栈顶long类型值取负,结果入栈。

0x84

(wide)iinc

indexbyte

constbyte

将整数值constbyte加到indexbyte指定的int类型的局部变量中。

浮点运算

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x62

fadd

将栈顶两float类型数相加,结果入栈。

0x66

fsub

将栈顶两float类型数相减,结果入栈。

0x6a

fmul

将栈顶两float类型数相乘,结果入栈。

0x6e

fdiv

将栈顶两float类型数相除,结果入栈。

0x72

frem

将栈顶两float类型数取模,结果入栈。

0x76

fneg

将栈顶float类型值取反,结果入栈。

0x63

dadd

将栈顶两double类型数相加,结果入栈。

0x67

dsub

将栈顶两double类型数相减,结果入栈。

0x6b

dmul

将栈顶两double类型数相乘,结果入栈。

0x6f

ddiv

将栈顶两double类型数相除,结果入栈。

0x73

drem

将栈顶两double类型数取模,结果入栈。

0x77

dneg

将栈顶double类型值取负,结果入栈。

逻辑运算——移位运算

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x78

ishl

左移int类型值。

0x79

lshl

左移long类型值。

0x7a

ishr

算术右移int类型值。

0x7b

lshr

算术右移long类型值。

0x7c

iushr

逻辑右移int类型值。

0x7d

lushr

逻辑右移long类型值。

逻辑运算——按位布尔运算

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x73

iand

对int类型按位与运算。

0x7f

land

对long类型的按位与运算。

0x80

ior

对int类型的按位或运算。

0x81

lor

对long类型的按位或运算。

0x82

ixor

对int类型的按位异或运算。

0x83

lxor

对long类型的按位异或运算。

控制流指令——条件跳转指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x99

ifeq

branchbyte1

branchbyte2

若栈顶int类型值为0则跳转。

0x9a

ifne

branchbyte1

branchbyte2

若栈顶int类型值不为0则跳转。

0x9b

iflt

branchbyte1

branchbyte2

若栈顶int类型值小于0则跳转。

0x9e

ifle

branchbyte1

branchbyte2

若栈顶int类型值小于等于0则跳转。

0x9d

ifgt

branchbyte1

branchbyte2

若栈顶int类型值大于0则跳转。

0x9c

ifge

branchbyte1

branchbyte2

若栈顶int类型值大于等于0则跳转。

0x9f

if_icmpeq

branchbyte1

branchbyte2

若栈顶两int类型值相等则跳转。

0xa0

if_icmpne

branchbyte1

branchbyte2

若栈顶两int类型值不相等则跳转。

0xa1

if_icmplt

branchbyte1

branchbyte2

若栈顶两int类型值前小于后则跳转。

0xa4

if_icmple

branchbyte1

branchbyte2

若栈顶两int类型值前小于等于后则跳转。

0xa3

if_icmpgt

branchbyte1

branchbyte2

若栈顶两int类型值前大于后则跳转。

0xa2

if_icmpge

branchbyte1

branchbyte2

若栈顶两int类型值前大于等于后则跳转。

0xc6

ifnull

branchbyte1

branchbyte2

若栈顶引用值为null则跳转。

0xc7

ifnonnull

branchbyte1

branchbyte2

若栈顶引用值不为null则跳转。

0xa5

if_acmpeq

branchbyte1

branchbyte2

若栈顶两引用类型值相等则跳转。

0xa6

if_acmpne

branchbyte1

branchbyte2

若栈顶两引用类型值不相等则跳转。

控制流指令——比较指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0x94

lcmp

比较栈顶两long类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈。

0x95

fcmpl

比较栈顶两float类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

0x96

fcmpg

比较栈顶两float类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

0x97

dcmpl

比较栈顶两double类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

0x98

dcmpg

比较栈顶两double类型值,前者大,1入栈;相等,0入栈;后者大,-1入栈;有NaN存在,-1入栈。

控制流指令——无条件跳转指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0xa7

goto

branchbyte1

branchbyte2

无条件跳转到指定位置。

0xc8

goto_w

branchbyte1

branchbyte2

branchbyte3

branchbyte4

无条件跳转到指定位置(宽索引)。

控制流指令——表跳转指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0xaa

tableswitch

<0-3bytepad>

defaultbyte1

defaultbyte2

defaultbyte3

defaultbyte4

lowbyte1

lowbyte2

lowbyte3

lowbyte4

highbyte1

highbyte2

highbyte3

highbyte4

jump offsets...

通过索引访问跳转表,并跳转。

0xab

lookupswitch

<0-3bytepad>

defaultbyte1

defaultbyte2

defaultbyte3

defaultbyte4

npairs1

npairs2

npairs3

npairs4

match offsets

通过键值访问跳转表,并跳转。

控制流指令——异常和finally

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0xbf

athrow

抛出异常。

0xa8

jsr

branchbyte1

branchbyte2

跳转到子例程序。

0xc9

jsr_w

branchbyte1

branchbyte2

branchbyte3

branchbyte4

跳转到子例程序(宽索引)。

0xa9

(wide)ret

indexbyte

返回子例程序。

对象操作指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0xbb

new

indexbyte1

indexbyte2

创建新的对象实例。

0xc0

checkcast

indexbyte1

indexbyte

类型强转。

0xc1

instanceof

indexbyte1

indexbyte2

判断类型。

0xb4

getfield

indexbyte1

indexbyte2

获取对象字段的值。

0xb5

putfield

indexbyte1

indexbyte2

给对象字段赋值。

0xb2

getstatic

indexbyte1

indexbyte2

获取静态字段的值。

0xb3

putstatic

indexbyte1

indexbyte2

给静态字段赋值。

数组操作指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0xbc

newarray

atype

创建type类型的数组。

0xbd

anewarray

indexbyte1

indexbyte2

创建引用类型的数组。

0xbe

arraylength

获取一维数组的长度。

0xc5

multianewarray

indexbyte1

indexbyte2

dimension

创建dimension维度的数组。

方法调用指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0xb7

invokespecial

indexbyte1

indexbyte2

编译时方法绑定调用方法。

0xb6

invokevirtual

indexbyte1

indexbyte2

运行时方法绑定调用方法。

0xb8

invokestatic

indexbyte1

indexbyte2

调用静态方法。

0xb9

invokeinterface

indexbyte1

indexbyte2

count

0

调用接口方法。

方法返回指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0xac

ireturn

返回int类型值。

0xad

lreturn

返回long类型值。

0xae

freturn

返回float类型值。

0xaf

dreturn

返回double类型值。

0xb0

areturn

返回引用类型值。

0xb1

return

void函数返回。

线程同步指令

指令码

操作码(助记符)

操作数

描述(栈指操作数栈)

0xc2

monitorenter

进入并获得对象监视器。

0xc3

monitorexit

释放并退出对象监视器。

相关文章
|
2天前
|
存储 Java 机器人
Java中的字节码与JVM指令集详解
Java中的字节码与JVM指令集详解
|
6天前
|
Java 对象存储
字节码学习之常见java语句的底层原理
字节码学习之常见java语句的底层原理
14 0
|
15天前
|
Java 大数据 API
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
55 0
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
|
1月前
|
设计模式 Java 程序员
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
|
1月前
|
算法 Java 编译器
从Java字节码到JIT编译器,深入理解Java虚拟机
Java虚拟机(JVM)是Java程序运行的关键。想深入理解Java虚拟机,我们需要了解Java字节码、类加载机制、垃圾回收算法、JIT编译器等方面的知识。本文将介绍这些关键知识点,并通过示例代码加深理解。
|
1月前
|
存储 安全 Java
深入理解Java字节码与反编译技术
深入理解Java字节码与反编译技术
39 0
|
1月前
|
XML 前端开发 Oracle
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
17 2
|
1月前
|
存储 缓存 安全
Java并发基础之互斥同步、非阻塞同步、指令重排与volatile
在Java中,多线程编程常常涉及到共享数据的访问,这时候就需要考虑线程安全问题。Java提供了多种机制来实现线程安全,其中包括互斥同步(Mutex Synchronization)、非阻塞同步(Non-blocking Synchronization)、以及volatile关键字等。 互斥同步(Mutex Synchronization) 互斥同步是一种基本的同步手段,它要求在任何时刻,只有一个线程可以执行某个方法或某个代码块,其他线程必须等待。Java中的synchronized关键字就是实现互斥同步的常用手段。当一个线程进入一个synchronized方法或代码块时,它需要先获得锁,如果
31 0
|
1月前
|
缓存 Java 计算机视觉
深入理解Java自动装箱和自动拆箱(反编译字节码理解每条指令)
在Java中,自动装箱(Autoboxing)是指将基本数据类型(如int、char等)自动转换为其对应的包装类(如Integer、Character等)的过程。而自动拆箱(Unboxing)则是将包装类的对象转换回其对应的基本数据类型的操作。这些特性从Java SE 5开始被引入,以方便开发者在处理基本类型和其包装类之间进行转换。 下面是一个简短的摘要: - **自动装箱**:当基本类型赋值给包装类时,例如 `Integer i = 1;`,Java会自动调用Integer的`valueOf()`方法,将int转换为Integer对象。对于数值在-128到127之间的int,会使用Int
55 2
深入理解Java自动装箱和自动拆箱(反编译字节码理解每条指令)
|
1月前
|
存储 Java 索引
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(核心结构剖析)
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透class字节码文件技术基底和实现原理(核心结构剖析)
44 0