如同操作一个普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令,可以用于直接操作操作数栈的指令。
    这类指令包括如下内容:

    • 将一个或两个元素从栈顶弹出,并且直接废弃:pop,pop2;
    • 复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶: dup,dup2,dupx1,dup2_x1, dup_x2,dup2×2;
    • 将栈最顶端的两个Slot数值位置交换:swap。Java虚拟机没有提供交换两个64位数据类型(long、double)数值的指令。
    • 指令nop,是一个非常特殊的指令,它的字节码为0x00。和汇编语言中的nop一样,它表示什么都不做。这条指令一般可用于调试、占位等。

    这些指令属于通用型,对栈的压入或者弹出无需指明数据类型。
    说明:
    不带_x的指令是复制栈顶数据并压入栈顶。包括两个指令,dup和dup2.dup的系数代表要复制的Slot个数。

    • dup开头的指令用于复制1个Slot的数据。例如1个int或1个reference类型数据
    • dup2开头的指令用于复制2个Slot的数据。例如1个long,或2个int,或1个int+1个float类型数据
    • 带_x的指令是复制栈顶数据并插入栈顶以下的某个位置。共有4个指令, dup_x1,dup2_x1,dup_x2,dup2_x2。对于带_x的复制插入指令,只要将指令的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:将栈顶的1个slot数值出栈。例如1个short类型数值
    • pop2:将栈顶的2个Slot数值出栈。例如1个double类型数值,或者2个int类型数值

    举例:
    之所以存在dup复制,是因为操作数栈中要用到obj这个应用的地址值去调这个对象的方法,需要用到,因为栈帧中每次执行都要消耗一个栈元素
    image.png
    下面有pop指令,是因为obj调了toString方法,返回一个toString方法的值,这个时候print要进行return,因为pirnt对象返回值是void,是返回一个空值,而现在的栈顶元素是toString的返回值,所以要先将栈顶元素弹出,再进行return。
    image.png
    image.png
    下面代码中,nextIndex方法最终返回的是0,因为在调取lreturn的时候,栈顶的元素就是0,之所以返回0的关键因素是在dup2_x1,它是先复制再进行ladd操作,index在栈中有两份,其中一份是0,一份是1,是1的用在putfield字段赋值,只剩下0了,而且之前复制的时候已经将0插入了栈底,所以会是0
    image.png
    如果是++index,那就是先进行加1再进行复制,这个时候返回的就是1
    image.png
    例子:

    1. package studies.stack;
    2. /**
    3. * 操作数栈的测试
    4. * @create 2020 下午 10:25
    5. */
    6. public class OperandStackTest {
    7. public void testAddOperation() {
    8. //byte、short、char、boolean:都以int型来保存
    9. byte i = 15;
    10. short j = 8;
    11. int k = i + j;
    12. long m = 12L;
    13. int n = 800;
    14. m = m * n;//存在宽化类型转换
    15. }
    16. public int getSum(){
    17. int m = 10;
    18. int n = 20;
    19. int k = m + n;
    20. System.out.println(k);
    21. return k;
    22. }
    23. public void testGetSum(){
    24. //获取上一个栈桢返回的结果,并保存在操作数栈中
    25. int i = getSum();
    26. int j = 10;
    27. }
    28. }