首页 > 解决方案 > 在 java 类文件中发现了一个未指定的 JVM 字节码 (0xe2)

问题描述

我最近正在开发一个可以分析 java 类文件的程序。运行程序后,这是它的输出: 程序输出 1 程序输出 2 程序输出 3

class test_1 {

    public static String a = "Hello World";

    public static void main(String[] args) {
        int j = 0;
        for(int i = 0;i<10;i++) {
            System.out.println(a);
            j = j + j*j +j/(j+1);
        }
    }
}

我得到了 jvm 规范 14 中未指定的字节码 0xe2。0xe2 有什么作用?

标签: javajvmbytecodeopcodejvm-bytecode

解决方案


您没有考虑多字节操作码。从goto 的参考资料中,格式为:

goto
branchbyte1
branchbyte2

无符号字节 branchbyte1 和 branchbyte2 用于构造带符号的 16 位 branchoffset,其中 branchoffset 为 (branchbyte1 << 8) | 分支字节2。执行从该 goto 指令的操作码地址的偏移处进行。目标地址必须是包含此 goto 指令的方法中的指令操作码的地址。

goto是 0xa7,它后面应该跟着 2 个字节表示分支位置,使指令有 3 个字节宽。您的代码忽略了这一点,反汇编 1 个字节,然后将接下来的 2 个字节视为有效指令,但它们不是。


推荐阅读