尚硅谷2020最新版宋红康JVM教程-中篇-第2章Class文件结构-7-操作数栈管理指令

    科技2022-07-13  132

    如同操作一个普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令,可以用于直接操作操作数栈的指令。这类指令包括如下内容: 将一个或两个元素从栈顶弹出,并且直接废弃:pop,pop2;复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:dup,dup2,dup_×1,dup2_×1,dup_×2,dup2_×2;将栈最顶端的两个slot数值位置交换:swap。Java虚拟机没有提供交换两个64位数据类型( long、doub1e)数值的指令。指令nop,是一个非常特殊的指令,它的字节码为exee。和汇编语言中的nop一样,它表示什么都不做。这条指令一般可用于调试、占位等。 这些指令属于通用型,对栈的压入或者弹出无需指明数据类型。说明: 不带x的指令是复制栈顶数据并压入栈顶。包括两个指令,dup和dup2。dup的系数代表要复制的Slot个数。dup开头的指令用于复制1个s1ot的数据。例如1个int或1个reference类型数据dup2开头的指令用于复制2个Slot的数据。例如1个long,或2个int,或1个int+1个float类型数据带_x的指令是复制栈顶数据并插入栈顶以下的某个位置。共有4个指令,dup_×1,dup2_×1,dup_×2,dup2_×2。对于带_x的复制插入指令,只要将指令的dup和x的系数相加,结果即为需要插入的位置。因此 dup_×1插入位置:1+1=2,即栈顶2个slot下面dup_×2插入位置:1+2=3,即栈顶3个slot下面dup2_×1插入位置:2+1=3,即栈顶3个Slot下面dup2_×2插入位置:2+2=4,即栈顶4个Slot下面 pop:将栈顶的1个slot数值出栈。例如1个short类型数值pop2:将栈顶的2个slot数值出栈。例如1个double类型数值,或者2个int类型数值

    代码举例

    public void print() { Object obj = new Object(); // String info=obj.toString(); // astore_2 obj.toString(); // pop } public void foo() { bar(); // pop2 } public long bar() { return 0; } // dup2_x1 private long index = 0; public long nextIndex() { return index++; }

    Processed: 0.011, SQL: 8