原文地址 https://blog.csdn.net/github_35983163/article/details/52945845 Java字節碼指令收集大全 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 釋放並退出對象監視器。 文章轉載自:https://blog.csdn.net/github_35983163/article/details/52945845