新闻详情

新闻详情

首页 / 资讯中心 / 详情

JVM 规范第 7 章详解:Opcode Mnemonics by Opcode(操作码助记符索引)

发布时间:2026/9/1 15:36:19来源:尧图网络
JVM 规范第 7 章详解:Opcode Mnemonics by Opcode(操作码助记符索引)
基于 Oracle 官方The Java® Virtual Machine SpecificationJava SE 26第 7 章《Opcode Mnemonics by Opcode》编写。定位提醒这是JVM 规范字节码级的最后一章。第 6 章讲每条指令做什么本章给你操作码字节 → 助记符的完整查表。当你拿到一段原始字节码class 文件的 hex dump靠这章就能逐字节翻出人类可读的指令名。1. 这一章在解决什么问题回想第 6 章的结论JVM 指令 1 字节操作码opcode 可选操作数操作码取值范围0x00–0xFF即 0–255。本章就是这 256 个槽位的黄页——把每个被使用的 opcode 映射到它的助记符mnemonic并交叉引用回第 6 章的定义小节。它几乎没有散文只有表。但正是这张表让你可以不依赖javap也能读懂字节码。本章要点有三opcode 是按功能聚簇的常量/load/store 占0x00–0x56栈/算术/转换占0x57–0x93比较/控制占0x94–0xb1引用占0xb2–0xc3扩展占0xc4–0xc9保留占0xca/0xfe/0xff。保留操作码0xcabreakpoint、0xfeimpdep1、0xffimpdep2留给调试器/实现私有用正常类文件里不会出现。历史注脚opcode186 (0xba)在Java SE 7 之前未被使用如今它是invokedynamic支撑 lambda/动态语言的关键指令。2. 操作码全表按功能分组下面是本章的完整映射按规范的自然分组排列。每组标题对应规范里的 Table 7.x。2.1 常量 / 加载 / 存储Table 7.1opcode 0x00–0x56常量压栈00–20Opcode助记符含义0x00nop空操作0x01aconst_null压入null0x02–0x08iconst_m1…iconst_5压入 int 常量 -1…50x09–0x0alconst_0/lconst_1压入 long 0/10x0b–0x0dfconst_0…fconst_2压入 float 0/1/20x0e–0x0fdconst_0/dconst_1压入 double 0/10x10bipush压入 1 字节有符号立即数0x11sipush压入 2 字节有符号立即数0x12ldc从常量池压入1 字节索引0x13ldc_w同上2 字节索引宽0x14ldc2_w压入 long/double2 字节索引局部变量加载21–53Opcode助记符含义0x15–0x19iload/lload/fload/dload/aload按索引加载局部变量1 字节操作数0x1a–0x2diload_0…iload_3、lload_0…aload_3加载槽 0–3 的快车道形式无操作数0x2e–0x35iaload…saload数组元素加载int/long/float/double/ref/byte/char/short局部变量存储54–86Opcode助记符含义0x36–0x3aistore/lstore/fstore/dstore/astore按索引存储局部变量0x3b–0x4eistore_0…astore_3存储槽 0–3 的快车道形式0x4f–0x56iastore…sastore数组元素存储2.2 栈 / 算术 / 转换Table 7.2–7.3opcode 0x57–0x93栈操作57–5fOpcode助记符含义0x57pop弹出栈顶 1 个字0x58pop2弹出栈顶 2 个字long/double0x59dup复制栈顶0x5a–0x5bdup_x1/dup_x2复制并插入栈顶下 1/2 位0x5c–0x5ddup2/dup2_x1复制栈顶 2 字0x5edup2_x2复制 2 字并插入0x5fswap交换栈顶两字算术60–84Opcode助记符含义0x60–0x63iadd/ladd/fadd/dadd加法0x64–0x67isub/lsub/fsub/dsub减法0x68–0x6bimul/lmul/fmul/dmul乘法0x6c–0x6fidiv/ldiv/fdiv/ddiv除法整数除零抛ArithmeticException0x70–0x73irem/lrem/frem/drem取余0x74–0x77ineg/lneg/fneg/dneg取负0x78–0x7bishl/lshl/ishr/lshr左移 / 算术右移0x7c–0x7diushr/lushr逻辑右移无符号0x7e–0x83iand/land/ior/lor/ixor/lxor位与 / 或 / 异或0x84iinc局部变量原地加常量类型转换85–93Opcode助记符含义0x85–0x87i2l/i2f/i2dint → long/float/double0x88–0x8al2i/l2f/l2dlong → int/float/double0x8b–0x8df2i/f2l/f2dfloat → int/long/double0x8e–0x90d2i/d2l/d2fdouble → int/long/float0x91i2bint → byte截断0x92i2cint → char截断0x93i2sint → short截断2.3 比较Table 7.4opcode 0x94–0xa6Opcode助记符含义0x94lcmp比较两个 long0x95–0x96fcmpl/fcmpg比较 floatNaN 处理不同0x97–0x98dcmpl/dcmpg比较 double0x99–0x9eifeq/ifne/iflt/ifge/ifgt/ifle比较栈顶 int 与 0满足条件跳转0x9f–0xa4if_icmpeq…if_icmple比较两个 int满足条件跳转0xa5–0xa6if_acmpeq/if_acmpne比较两个引用相等/不等2.4 控制Table 7.4 续opcode 0xa7–0xb1Opcode助记符含义0xa7goto无条件跳转0xa8jsr跳转到子例程旧版 finally第 3 章讲过0xa9ret从子例程返回0xaatableswitch密集 switch偏移表0xablookupswitch稀疏 switch配对表0xac–0xb0ireturn/lreturn/freturn/dreturn/areturn返回各类型值0xb1return返回 void2.5 引用Table 7.5opcode 0xb2–0xc3Opcode助记符含义0xb2–0xb3getstatic/putstatic读写静态字段0xb4–0xb5getfield/putfield读写实例字段0xb6invokevirtual调用实例方法虚派发0xb7invokespecial调用构造器/私有/父类方法0xb8invokestatic调用静态方法0xb9invokeinterface调用接口方法0xbainvokedynamic动态调用Java SE 7lambda 支撑0xbbnew创建对象分配未初始化0xbc–0xbdnewarray/anewarray创建基本/引用类型数组0xbearraylength取数组长度0xbfathrow抛出异常0xc0checkcast类型检查转换0xc1instanceof类型判断0xc2–0xc3monitorenter/monitorexit进入/退出管程synchronized2.6 扩展opcode 0xc4–0xc9Opcode助记符含义0xc4wide扩展后续指令的索引/操作数为 2 字节0xc5multianewarray创建多维数组0xc6–0xc7ifnull/ifnonnull引用为 null / 非 null 则跳转0xc8goto_w跳转4 字节偏移宽0xc9jsr_w子例程跳转宽2.7 保留opcode 0xca / 0xfe / 0xffOpcode助记符含义0xcabreakpoint断点指令调试器用0xfeimpdep1实现私有保留0xffimpdep2实现私有保留这三者和nop、wide之外的宽形式都不该出现在正常编译产物里。breakpoint由 JPDA 调试器在运行时替换注入impdep1/2留给特定 JVM 实现自定义。3. 怎么用这章从原始字节码反查指令假设你用javap -c -v之外的方式拿到了一段 class 文件字节或想看懂xxd的 hex dump流程是读 1 字节作 opcode在本章表里查助记符按第 6 章该指令的格式读后续操作数1 字节或 2 字节或tableswitch/lookupswitch的对齐填充操作数常是常量池索引再翻第 4 章的常量池。示例字节流2a b4 00 0a 60 3c对应第 3/6 章讲过的x a b字节opcode助记符说明2a0x2aaload_0加载 this槽 0b4 00 0a0xb4getfield操作数00 0a 常量池 #10字段a2a b4 00 0b…aload_0getfield#11取字段b600x60iadd两 int 相加3c0x3cistore_1存回槽 1变量 x这正是第 6 章综合例子的原字节流——本章让你脱离工具也能逐字节读懂它。4. 动手用javap印证 opcode写一个最简类再用javap看助记符与字节码publicclassAdd{publicstaticintadd(inta,intb){returnab;}}编译 反汇编PowerShelljavac Add.java javap-c Add编译 反汇编CMDjavac Add.java javap -c Add你会看到add方法大致是0: iload_1 // 0x1b 加载参数 a槽 1 1: iload_2 // 0x1c 加载参数 b槽 2 2: iadd // 0x60 相加 3: ireturn // 0xac 返回 int把这里的十六进制第 6 章javap输出里也会标注和本章表对照就能确认iload_1 0x1b、iadd 0x60、ireturn 0xac。也可用javap -c -v Add看更完整的字节码段。5. 练习附要点练习 1opcode 0xac、0xb1、0xbb、0xba 分别是哪条指令其中哪个在 Java SE 7 之前未被使用0xacireturn、0xb1return、0xbbnew、0xbainvokedynamic。其中0xba (invokedynamic)在 Java SE 7 之前未被使用规范本章开篇明记。练习 2为什么 iload_0 到 iload_3 要用独立的 opcode0x1a–0x1d存在而 iload 还要带 1 字节操作数这是快车道fast lane优化最常用到的前 4 个局部变量槽无需额外操作数字节1 字节搞定整条指令缩短字节码、提升解释执行速度。第 6 章讲过同理的iconst_0–iconst_5、dup等。练习 3字节流 03 04 60 对应哪三条指令结果是什么03iconst_0压 0、04iconst_1压 1、60iadd相加。栈顶 0 与 1 相加 → 结果 1。练习 40xca、0xfe、0xff 这三条保留 opcode 在普通类文件里会出现吗分别做什么用通常不会。0xcabreakpoint调试器注入的断点0xfe/0xffimpdep1/impdep2实现私有保留供特定 JVM 自定义语义。它们不属于正常编译产物。练习 5要在字节码里读一个 2 字节常量池索引的 ldc该用哪个 opcode若索引超过 255 又该用哪个0x12ldc1 字节索引范围 0–255超过 255 用0x13ldc_w2 字节索引。long/double 常量则用0x14ldc2_w。6. 小结与下一步第 7 章是 JVM 规范的收尾它把前六章铺开的 200 指令收拢成一张操作码→助记符的总查表。记住三件事opcode 是 1 字节、按功能聚簇常量/load/store00–56、栈/算术/转换57–93、比较/控制94–b1、引用b2–c3、扩展c4–c9、保留ca/fe/ff。保留槽给基础设施breakpoint给调试器、impdep1/2给实现私有invokedynamic (0xba)是 Java SE 7 才启用的新坑。它是javap的底层字典拿到原始字节码按本章逐字节翻就能脱离工具读懂每条指令。JVM 规范系列进度已全部读完1-jvm-intro导论2-jvm-structure结构3-jvm-compilation编译4-jvm-classfile文件格式5-jvm-loading-linking-init加载链接初始化6-jvm-instructionset指令集 本篇7-jvms-opcode-index操作码索引。六章正文 一章索引构成完整 JVM 规范精读。下一步建议配 JLS 系列1-jls-intro至5-jls-conversions继续读第 6 章 Names或把JVM 7 篇 JLS 5 篇合并成一份《Java 规范精读》总集带总目录、交叉引用、统一术语表方便系统查阅也可用javap -c -v对任意真实类做字节码拆解实战把规范落到代码上。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Excel VBA正则表达式批量拆分地址到省市街道电话邮编 2026/9/1 19:07:27

Excel VBA正则表达式批量拆分地址到省市街道电话邮编

一张几千行的地址清单,从系统导出、手工录入、甚至从聊天记录里复制出来,格式大概是这样:“广东省深圳市南山区科技园路112号 电话13800138000 邮编518000”“张三 北京市海淀区中关村大街1号院 010-12345678”。现在要求把它们按省、市、区县…

阅读更多 →
实测7款平价智能配音,不到200块年卡就能搞定全创作场景需求 2026/9/1 19:07:27

实测7款平价智能配音,不到200块年卡就能搞定全创作场景需求

做视频这几年,配音这件事几乎成了每个创作者绕不开的坎。自己录吧,声音干巴巴没有感染力;花钱请人吧,一条几分钟的旁白动辄几百块;充个会员吧,发现好听的音色还要单独买,免费导出的音频每隔十秒…

阅读更多 →
电机控制秋招技能图谱:从STM32基础到FOC实战 2026/9/1 19:07:27

电机控制秋招技能图谱:从STM32基础到FOC实战

又到一年秋招季,后台收到不少准备投电机控制、嵌入式方向的同学留言,问得最多的一个问题就是:电机控制秋招到底哪些才是重点技能?网上资料很杂,今天学一点 STM32,明天看一点 Simulink,后天又去刷…

阅读更多 →
MMD模型导入Unity全流程:材质、动画、VR打包与性能优化实战 2026/9/1 19:07:27

MMD模型导入Unity全流程:材质、动画、VR打包与性能优化实战

很多做 MMD 的伙伴第一次把角色模型放进 Unity 时,都会遇到类似的困惑:照着教程一步步操作,模型却发红发紫,动画要么滑步要么穿模,表情怎么调都出不来。更别提后面打包 Android、接 Pico 4 这类 VR 设备时,…

阅读更多 →
上手 OpenClaw,Windows 与 macOS 双平台安装实操分享 2026/9/1 19:07:27

上手 OpenClaw,Windows 与 macOS 双平台安装实操分享

OpenClaw 一键安装包|快速搭建本地 AI 自动化工具📦 适配系统:Windows10/11 64 位、macOS 12 及以上 当前版本:Windows v3.1.0、macOS v2.7.9 安装包大小:约 45.8MB 下载地址 Windows3.1.0 版本:https:/…

阅读更多 →
MTK芯片手机维修实战:DT Pro Tool修复IMEI与解除账户锁全流程 2026/9/1 19:04:27

MTK芯片手机维修实战:DT Pro Tool修复IMEI与解除账户锁全流程

简介:本资源是专为手机维修工程师与MTK平台固件开发者设计的专业级工具包,聚焦IMEI修复与网络解锁两大核心场景,适用于因软件异常、刷机失误或硬件维修导致的IMEI丢失、串码错误及运营商锁机问题。压缩包共272个文件,含55个img&am…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞