jvm中pop和pop2指令有什么区别?

4 java jvm

我参考了下面的oracle jvm 文档

\n\n

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.pop

\n\n
\n

pop操作 弹出栈顶操作数的值

\n\n

格式

\n\n

弹出表单 弹出 = 87 (0x57)

\n\n

操作数堆栈...,值\xe2\x86\x92

\n\n

...

\n\n

描述 从操作数栈中弹出顶部值。

\n\n

除非 value 是类别 1 计算类型 (\xc2\xa72.11.1) 的值,否则不得使用 pop 指令。

\n\n

pop2操作 弹出操作数栈顶部的一个或两个值

\n\n

格式

\n\n

pop2 形式 pop2 = 88 (0x58)

\n\n

操作数堆栈形式 1:

\n\n

..., 值2, 值1 \xe2\x86\x92

\n\n

...

\n\n

其中 value1 和 value2 都是类别 1\n 计算类型 (\xc2\xa72.11.1) 的值。

\n\n

表格2:

\n\n

...,值 \xe2\x86\x92

\n\n

...

\n\n

其中 value 是类别 2 计算类型的值 (\xc2\xa72.11.1)。

\n\n

说明 从操作数堆栈中弹出顶部的一个或两个值。

\n
\n\n

“从操作数堆栈中弹出前一个或两个值”是什么意思?使用 pop2 时的示例是什么?

\n

Cor*_*onA 5

编写一个包含 main 方法的小型 java 程序

System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)

不要使用此调用的结果。然后字节码看起来像

INVOKESTATIC java/lang/System.currentTimeMillis()J
POP2
Run Code Online (Sandbox Code Playgroud)

System.currentTimeMillis()将一个长值(64 位,宽)放入堆栈。然而,该堆栈内容不再使用,因此必须将其弹出,以便可以访问其他堆栈内容。32 位(正常大小)需要一个 simple POP,64 位(宽大小)需要一个POP2.