首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JVM 指令集速查表:完整 Opcode 助記符對照表

     編輯:Java 綜合教學

JVM 字節碼指令集完整對照表

Java 虛擬機指令由單字節操作碼(Opcode)與零至多個操作數組成。熟悉指令集有助於閱讀字節碼、編寫字節碼操作工具、優化性能及排查疑難問題。下表按功能分類匯總所有標準指令(基於 JVM Spec 8)。

常量加載指令

Opcode助記符說明
0x00nop無操作
0x01aconst_null將 null 壓入棧
0x02iconst_m1將 int -1 壓入棧
0x03~0x08iconst_0 ~ iconst_5將 int 0~5 壓入棧
0x09~0x0Alconst_0, lconst_1將 long 0/1 壓入棧
0x0B~0x0Dfconst_0 ~ fconst_2將 float 0.0~2.0 壓入棧
0x0E~0x0Fdconst_0, dconst_1將 double 0.0/1.0 壓入棧
0x10bipush將單字節常量(-128~127)壓入棧
0x11sipush將 short 常量(-32768~32767)壓入棧
0x12ldc將常量池 int/float/String 壓入棧
0x13ldc_w寬索引版 ldc
0x14ldc2_w將常量池 long/double 壓入棧(寬索引)

局部變量加載指令

Opcode助記符說明
0x15iload將指定索引 int 變量壓入棧
0x16lload將指定索引 long 變量壓入棧
0x17fload將指定索引 float 變量壓入棧
0x18dload將指定索引 double 變量壓入棧
0x19aload將指定索引引用變量壓入棧
0x1A~0x1Diload_0 ~ iload_3將第 1~4 個 int 變量壓入棧(隱式索引)
0x1E~0x21lload_0 ~ lload_3將第 1~4 個 long 變量壓入棧
0x22~0x25fload_0 ~ fload_3將第 1~4 個 float 變量壓入棧
0x26~0x29dload_0 ~ dload_3將第 1~4 個 double 變量壓入棧
0x2A~0x2Daload_0 ~ aload_3將第 1~4 個引用變量壓入棧

數組加載指令

Opcode助記符說明
0x2Eialoadint 數組加載
0x2Flaloadlong 數組加載
0x30faloadfloat 數組加載
0x31daloaddouble 數組加載
0x32aaload引用數組加載
0x33baloadbyte/boolean 數組加載
0x34caloadchar 數組加載
0x35saloadshort 數組加載

局部變量存儲指令

Opcode助記符說明
0x36istore棧頂 int 存入指定索引
0x37lstore棧頂 long 存入指定索引
0x38fstore棧頂 float 存入指定索引
0x39dstore棧頂 double 存入指定索引
0x3Aastore棧頂引用存入指定索引
0x3B~0x3Eistore_0 ~ istore_3棧頂 int 存入第 1~4 個局部變量
0x3F~0x42lstore_0 ~ lstore_3棧頂 long 存入第 1~4 個局部變量
0x43~0x46fstore_0 ~ fstore_3棧頂 float 存入第 1~4 個局部變量
0x47~0x4Adstore_0 ~ dstore_3棧頂 double 存入第 1~4 個局部變量
0x4B~0x4Eastore_0 ~ astore_3棧頂引用存入第 1~4 個局部變量

數組存儲指令

Opcode助記符說明
0x4Fiastoreint 數組存儲
0x50lastorelong 數組存儲
0x51fastorefloat 數組存儲
0x52dastoredouble 數組存儲
0x53aastore引用數組存儲
0x54bastorebyte/boolean 數組存儲
0x55castorechar 數組存儲
0x56sastoreshort 數組存儲

棧操作指令

Opcode助記符說明
0x57pop彈出棧頂(非 long/double)
0x58pop2彈出棧頂 long/double 或兩個普通值
0x59dup復制棧頂值
0x5Adup_x1復制棧頂並插入次棧頂
0x5Bdup_x2復制棧頂並插入第三位置
0x5Cdup2復制棧頂兩個值
0x5Ddup2_x1復制棧頂兩值並插入
0x5Edup2_x2復制棧頂兩值並插入
0x5Fswap交換棧頂兩值

算術與邏輯指令

Opcode助記符說明
0x60~0x63iadd, ladd, fadd, dadd加法
0x64~0x67isub, lsub, fsub, dsub減法
0x68~0x6Bimul, lmul, fmul, dmul乘法
0x6C~0x6Fidiv, ldiv, fdiv, ddiv除法
0x70~0x73irem, lrem, frem, drem取模
0x74~0x77ineg, lneg, fneg, dneg取負
0x78~0x7Dishl, lshl, ishr, lshr, iushr, lushr位移操作
0x7E~0x83iand, land, ior, lor, ixor, lxor位運算
0x84iinc局部變量自增

類型轉換指令

Opcode助記符說明
0x85~0x93i2l, i2f, i2d, l2i, l2f, l2d, f2i, f2l, f2d, d2i, d2l, d2f, i2b, i2c, i2s數值類型轉換(寬化/窄化)

比較與控制流指令

Opcode助記符說明
0x94lcmplong 比較,結果 -1/0/1 入棧
0x95~0x96fcmpl, fcmpgfloat 比較,NaN 處理不同
0x97~0x98dcmpl, dcmpgdouble 比較,NaN 處理不同
0x99~0x9Eifeq, ifne, iflt, ifge, ifgt, ifleint 與 0 比較跳轉
0x9F~0xA4if_icmpeq ~ if_icmple兩 int 比較跳轉
0xA5~0xA6if_acmpeq, if_acmpne引用比較跳轉
0xA7goto無條件跳轉
0xA8jsr跳轉子程序(已棄用)
0xA9ret返回子程序(已棄用)
0xAAtableswitchswitch 連續 case
0xABlookupswitchswitch 非連續 case
0xAC~0xB0ireturn, lreturn, freturn, dreturn, areturn, return各類型返回

字段、方法、對象操作指令

Opcode助記符說明
0xB2getstatic獲取靜態字段
0xB3putstatic設置靜態字段
0xB4getfield獲取實例字段
0xB5putfield設置實例字段
0xB6invokevirtual調用實例方法
0xB7invokespecial調用構造器/私有/父類方法
0xB8invokestatic調用靜態方法
0xB9invokeinterface調用接口方法
0xBAinvokedynamic調用動態方法
0xBBnew創建對象
0xBCnewarray創建基本類型數組
0xBDanewarray創建引用類型數組
0xBEarraylength獲取數組長度
0xBFathrow拋出異常
0xC0checkcast類型檢查轉換
0xC1instanceof實例檢查
0xC2monitorenter進入同步塊
0xC3monitorexit退出同步塊

擴展與保留指令

Opcode助記符說明
0xC4wide擴展局部變量索引寬度
0xC5multianewarray創建多維數組
0xC6ifnull為 null 跳轉
0xC7ifnonnull非 null 跳轉
0xC8goto_w寬索引無條件跳轉
0xC9jsr_w寬索引子程序跳轉
0xCAbreakpoint調試斷點
0xFEimpdep1硬件相關保留
0xFFimpdep2硬件相關保留

使用建議

  • 配合 javap -c ClassName 查看編譯後字節碼。
  • ASM、Byte Buddy 等字節碼操作庫開發時必備參考。
  • 注意 wide 前綴指令會將後續指令的索引從 16 位擴展為 32 位。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved