zoukankan      html  css  js  c++  java
  • i++ 反编译码

    1、特点:

    1. 操作数栈,主要用于保存计算过程中的结果,同时作为集计算过程中变量临时的存储空间

    2. 操作数栈就是JVM执行引擎的一个工作区,当方法执行开始,一个新栈帧也会随之被创建,这个方法的操作数栈是空的。

    3. 每一个操作数栈都会拥有一个明确的栈深入用于存储数据值

    4. 我们说是java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是操作数栈。

    5. 如果被调用的方法带有返回值的话,其返回值将被压入当前栈帧操作数栈中

    2、执行过程

    反编译字节码文件

    1、第一步:

    • bipush:将值压入操作数栈的操作。

    • istore_1:将栈顶指针指向的值放入局部变量表中索引为1的地方。

    • iload_1:将局部变量表中索引为1的值压入操作数栈中

    • iadd:让操作数栈中数字纷纷出栈,通过 执行引擎进行add操作。

    PC寄存器中存储第0的指令地址,然后对应指令地址执行对应的操作指令bipush。将15压入操作数栈,此时栈顶指针指向15。
    PC寄存中存入2的地址指令,15出栈,进入局部变量表中索引为1的位置(istore_1)(索引为0的位置存放的this)

    2、第二部

    8压入操作数栈(bipush),然后出栈进入局部变量表索引为2的位置(istore_2)

    3、第三步

    iload_1 和 iload_2 分别将局部变量表中的15和8放入操作数栈中。

    4、第四步

    将操作数栈中的15和8分别出栈,进行iadd操作,相加后的值再次压入到操作数栈中。然后执行istore_3.。将23出栈,放入局部变量表索引为3的地方。

    3、i = i++值不变

    i = 0;
    i = i++;
    

    反编译:

    数字的:1,2,..6,7:是pc寄存器存储的指令地址,指示执行对应的操作指令

    0:iconst_0;   // 将int类型的0 入栈
    1:istore_1;   // 将栈顶0弹出,保存到局部变量 index索引值为1 的位置。
    2:iload_1;    // 将局部变量表 index 1位置的值的副本入栈,(此时:局部变量表 index为1的值是0,操作数栈顶的值是0)
    3:iinc_1,1;   // iinc是对int类型的值进行自增操作(局部变量表index 1的值执行了自增变为了1,单操作数栈中的值仍然为0)
    6:istore_1;   // 操作数栈顶的值弹出(值为 0),放到局部变量表index 1的位置(旧值:1,新值:0),覆盖到上一步的局部变量表中。
    7:iload_1;    // 将局部变量表index 1的位置的副本入栈
    

    转发连接:https://blog.csdn.net/weixin_44717746/article/details/107774945

  • 相关阅读:
    Java参数传递方式
    C++成员函数的 重载、隐藏、覆盖分析(转)
    回调函数 (一)
    Java之String 专题二
    从10亿个浮点数中找出最大的1万个
    【onclick事件】【改变 HTML 内容innerHTML】【图片替换】【改变标签的css】【判断输入是否是数字】
    【页面加载】【九九乘法表】【document.write的功能_】【<script>直接显示数组】【声明新变量】
    Windows10 环境下安装 ElasticSearch
    数据包和数据报有何区别?
    NIO 通道和缓冲区
  • 原文地址:https://www.cnblogs.com/zhouyongyin/p/13540361.html
Copyright © 2011-2022 走看看