共计 1208 个字符,预计需要花费 4 分钟才能阅读完成。
一、操作数栈治理指令的概述
如同操作一般数据结构中的堆栈那样,JVM 提供的 操作数栈治理指令能够间接用于操作操作数栈
常见指令包含如下内容:
将一个或两个元素从栈顶弹出,并且间接废除,采纳:pop、pop2
指令
将复制栈顶的一个或两个数值,并将复制值或双份的复制值从新压入栈顶,采纳 dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2
指令
将栈最顶端的两个 Slot 数值地位替换,采纳:swap
指令,Java 虚拟机没有提供替换两个 64 位数据类型(long、double)数值的指令
非凡指令:nop
,它的字节码为 ex00。和汇编语言中的 nop 一样,它示意什么都不做。这条指令个别可用于调试、占位等
这些指令属于通用型,对栈的压入或者弹出无需指明数据类型
不带_x 的 dup 指令阐明
dup 是复制栈顶数据并压入栈顶,个别包含两个指令:dup、dup2
,系数代表要复制的 slot 个数
- dup 结尾的指令用于复制 1 个 Slot 的数据。例:1 个 int 或者 1 个 reference
- dup2 结尾的指令用于复制 2 个 Slot 的数据。例:1 个 long,或 2 个 int,或 1 个 int + 1 个 float
带_x 的 dup 指令阐明
dup_x 是复制栈顶数据并插入栈顶以下的某个地位,共有四个指令:dup_x1,dup2_x1,dup_x2,dup2_x2
,只有将指令的 dup 和 x 的系数相加,后果即为须要插入的地位。
- dup_x1 插入地位:1+1=2,即栈顶 2 个 Slot 上面
- dup_x2 插入地位:1+2=3,即栈顶 3 个 Slot 上面
- dup2_x1 插入地位:2+1=3,即栈顶 3 个 Slot 上面
- dup2_x2 插入地位:2+2=4,即栈顶 4 个 slot 上面
pop 指令与 pop2 指令阐明
- pop: 将栈顶的 1 个 s1ot 数值出栈。例如 1 个 short 类型数值
- pop2: 将栈顶的 2 个 Slot 数值出栈。例如 1 个 double 类型数值,或者 2 个 int 类型数值
接下来咱们针对于操作数栈指令的根本测试,请看以下示例代码
public class stackOperateTest {public void print(){object obj = new object();
string info = bj.toString();}
// 相似的
public void foo(){bar();
}
public long bar(){return 0;}
private long index = 0;
public long nextIndex() {return index++;}
}
接下来咱们编译该代码,看看 print 办法的字节码是什么状况?
接下来咱们依据字节码指令进行图示解析剖析,具体做了哪些操作?
若咱们不须要采纳 info 变量接管,间接调用 obj.toString 办法会是什么字节码呢?
接下来咱们看看 foo 办法的字节码是什么状况?
接下来咱们看看 nextIndex 办法的字节码是什么状况?
接下来咱们依据字节码指令进行图示解析剖析,具体做了哪些操作?
正文完