java - 在 java 类文件中发现了一个未指定的 JVM 字节码 (0xe2)
问题描述
我最近正在开发一个可以分析 java 类文件的程序。运行程序后,这是它的输出:
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 有什么作用?
解决方案
您没有考虑多字节操作码。从goto 的参考资料中,格式为:
goto
branchbyte1
branchbyte2
无符号字节 branchbyte1 和 branchbyte2 用于构造带符号的 16 位 branchoffset,其中 branchoffset 为 (branchbyte1 << 8) | 分支字节2。执行从该 goto 指令的操作码地址的偏移处进行。目标地址必须是包含此 goto 指令的方法中的指令操作码的地址。
goto
是 0xa7,它后面应该跟着 2 个字节表示分支位置,使指令有 3 个字节宽。您的代码忽略了这一点,反汇编 1 个字节,然后将接下来的 2 个字节视为有效指令,但它们不是。
推荐阅读
- .net-core - 在 HeroCard 中发送 CardActions 作为欢迎信息并直接进入相应的对话框
- .net-core - 如何在同一个项目中创建具有 Angular7 + WebAPI + AzureAD 的 .NET Core 应用程序
- python - 如何将 Ansible 模块 wait_for 与循环一起使用?
- php - PHP foreach 没有遍历嵌套数组
- c# - 将 FeedOptions.EnableCrossPartitionQuery 设置为 false 是否需要与 FeedOptions.PartitionKey 结合使用?
- ruby - 如何在 Ruby 中对本地应用程序进行 x-callback-url 调用?
- json - JSONPath 正则表达式 - 不以
- sql - 派生列表达式
- python - Python opencv检测棋盘
- html - 如何将多个连接的 .html 文件一起作为网站打开?