一、操作数栈管理指令的概述
如同操作普通数据结构中的堆栈那样,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方法的字节码是什么情况?
接下来我们根据字节码指令进行图示解析分析,具体做了哪些操作?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。