微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JVM——24字节码指令集与解析六操作数栈管理指令

文章目录

往期文章

JVM——(1)为什么学习虚拟机
JVM——(2)聊聊JVM虚拟机
JVM——(3)类加载子系统
JVM——(4)运行时数据区的概述与程序计数器(PC寄存器)
JVM——(5)运行时数据区的虚拟机栈
JVM——(6)运行时数据区的本地方法栈
JVM——(7)运行时数据区的堆空间
JVM——(8)运行时数据区的方法区
JVM——(9)对象的实例化与访问定位
JVM——(10)执行引擎
JVM——(11)String Table(字符串常量池)
JVM——(12)垃圾回收概述
JVM——(13)垃圾回收相关算法
JVM——(14)垃圾回收相关概念的概述
JVM——(15)垃圾回收器详细篇
JVM——(16)Class文件结构一(描述介绍)
JVM——(17)Class文件结构二(解读字节码)
JVM——(18)Class文件结构三(JAVAP指令)
JVM——(19)字节码指令集与解析一(局部变量压栈、常量变量压栈、出栈局部变量表指令)
JVM——(20)字节码指令集与解析二(算数指令)
JVM——(21)字节码指令集与解析三(类型转换指令)
JVM——(22)字节码指令集与解析四(对象创建与访问指令)
JVM——(23)字节码指令集与解析五(方法调用指令与方法返回指令)
JVM——(24)字节码指令集与解析六(操作数栈管理指令)

一、操作数栈管理指令的概述


如同操作普通数据结构中的堆栈那样,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方法的字节码是什么情况?

在这里插入图片描述

接下来我们根据字节码指令进行图示解析分析,具体做了哪些操作?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

下面是本人的公众号:(有兴趣可以扫一下,文章会同步过去)

在这里插入图片描述

我是小白弟弟,一个在互联网行业的小白,立志成为一名架构师
https://blog.csdn.net/zhouhengzhe?t=1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐