java - 了解打印某些东西的字节码
问题描述
请帮助这个字节码将打印什么
BIPUSH 10
BIPUSH 7
IXOR
ISTORE 1
IINC 1 19
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
解决方案
我强烈建议阅读 JVM 规范,它解释了一切。
浏览您的具体示例
BIPUSH 10
这会将 10 推入堆栈
BIPUSH 7
这会将 7 推入堆栈。堆栈现在是 10 7
IXOR
这对前两个元素进行异或。堆栈现在是 10^7 = 13
ISTORE 1
这将顶部元素存储在局部变量槽 1 中。堆栈现在是空的,而局部变量是 [INVALID, 13]
IINC 1 19
这会将本地 1 增加 19。本地现在是 [INVALID, 32]
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
这会将 System.out 推入堆栈
ILOAD 1
这会将变量加载到堆栈中
INVOKEVIRTUAL java/io/PrintStream.println (I)V
这会打印出来。所以最终的结果是打印32
。
该字节码可能是由 Java 代码按照以下行生成的
int x = 10 ^ 7;
x += 19;
System.out.println(x);
推荐阅读
- javascript - 在 div 中找到第一个 pre 标记,然后删除前导空格
- math - 将十进制数转换为浮点表示法和 IEEE 754 格式
- loops - 脚本未通过所有迭代运行,并陷入循环
- angular - 按照角度教程,重定向似乎是附加页面而不是替换
- python - 使用 dict 和 set 从列表中删除重复项之间的区别?
- autodesk-forge - 无需 Revit Desktop 应用程序即可直接访问 Revit DB API 以提取和更新属性
- python - 如何在python中编码IP地址?
- mysql - MySQL查询以将同一月份的订单数填充为输入表的每一行中的单独列
- instagram - 请求 Instagram 应用程序来验证我们的网站用户
- r - 更改默认调色板的填充/颜色美学方向