java - INVOKESTATIC 操作是否会反转堆栈顺序?

标签 java bytecode

我正在研究 Java 字节码,当时我注意到简单的表达式 Math.max(0,1) 被转换为以下字节码指令。

ICONST_0, 
ICONST_1, 
INVOKESTATIC(java/lang/Math.max)

我的问题是,如果java使用后进先出堆栈,这意味着1现在将位于堆栈上0的前面,这意味着虚拟机必须反转堆栈上项目的顺序。调用 max 指令来获取 1 之前的 0。但是在规范中,它说注意到这一点,我的假设是否正确。

最佳答案

参数堆栈只是一个抽象。当一个操作接受 n 个参数时,前 n 个参数将从堆栈中取出并从下到上使用,正如您所观察到的。这不仅适用于 invokestatic,也适用于每条字节码指令。

例如以下序列

iconst_0 图标t_1 图标t_2 isub

将 0、1 和 2 压入堆栈。 isub 指令弹出顶部两个值 1 和 2,并从下到上使用它们,因此结果为 1-2 = -1。因此,最终结果是一个包含0、-1的堆栈。

如果您对此类细节感兴趣,您应该尝试阅读 JVM 规范。

关于java - INVOKESTATIC 操作是否会反转堆栈顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18424833/

相关文章:

java - ref 的字符串赋值。在此语句之后将对象字符串写入内存会发生吗?

java - 对字符串数组进行计数和排序的最佳方法是什么

java - 即使不调用 persist,JPA/Hibernate 是否保存

ASM 中的 Java 方法参数值

actionscript-3 - 在 ActionScript Bytecode 中,NewActivation 是什么意思?

java - 创建对象时处理二维条件的方法?

java - Eclipse 不在 JPA 配置中显示 EclipseLink 平台

python - while True 还是 while 1?

bytecode - 以太坊字节码 JUMP 和 JUMPDEST 是如何解决的?

java - 从 Java 字节码构建解析树/AST