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

i++ 反编译码的更多相关文章

  1. LDPC编译码基本原理

    LDPC编译码基本原理     学习笔记 V1.1 2015/02/18 LDPC编译码基本原理   概述   本文是个人针对LDPC的学习笔记,主要针对LDPC译码算法做了简要的总结.该版本主要致力 ...

  2. Java&Android反编工具打包

    Java&Android反编工具: 1.Eclipse反编插件:安装到Eclipse后,可以简要的查看jar包中的*.class; 2.DoAPK:反编*.apk为smali和一些资源文件,可 ...

  3. CCSDS标准的LDPC编译码仿真

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. JAVA反编工具件安装 JD-eclipse

    想看Android  API源码,但是只有class文件,于是找了个反编译工具Java Decompiler,免费的反编译工具.eclipse插件:JD-eclipse. 安装步骤: 1.确保计算机上 ...

  5. 快速反编绎jar war包

    反编译这些class文件或jar包或war包,用TTools https://github.com/Supermax197/TTools [root@ok action]# tree /home/ok ...

  6. Android反编工具的使用-Android Killer

    今天百度搜索"Android反编译"搜索出来的结果大多数都是比較传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比較方便操作的Android ...

  7. PhotoShop算法原理解析系列 - 风格化---》查找边缘。

    之所以不写系列文章一.系列文章二这样的标题,是因为我不知道我能坚持多久.我知道我对事情的表达能力和语言的丰富性方面的天赋不高.而一段代码需要我去用心的把他从基本原理-->初步实现-->优化 ...

  8. Scala变量| 流程控制

    Scala 是 Scalable Language 的简写,是一门多范式(编程的方式)的编程语言 Scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的 ...

  9. apk 解包 打包

    APK应用程序的解包.修改.编辑.汉化.打包及应用 前两讲主要讲玩机的最基本的知识,集中在如何刷机.本讲是进级的内容,来谈谈与apk应用程序有关的知识,内容包括akp文件的解包.打包.反编辑.解析.汉 ...

随机推荐

  1. linux_20

    总结tomcat优化方法 java程序出现oom如何解决?什么场景下会出现oom? 简述redis特点及其应用场景 对比redis的RDB.AOF模式的优缺点 实现redis哨兵,模拟master故障 ...

  2. python基础语法_python中的布尔类型详解

    转自:http://www.cnblogs.com/521yywzyzhc/p/6264885.html   我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是 ...

  3. python语法_1基础语法概述

    http://www.runoob.com/python3 章节:教程.基础语法.数据类型.解释器.注释.运算符. 大纲 查看python版本 实现第一个python3.x程序,hello world ...

  4. javascript 书

    作者limu 整理的书 http://web.jobbole.com/8087/ 慢慢整理, 后续还会添加

  5. (4)Canal多实例使用

    1.前言 很多时候,我们很多业务场景可能只需要同步多个或者单个数据库多个或者单个表的数据,canal提供了多实例(Instance)功能让我们可以处理这些业务场景.废话少说,让我们来学习下这块知识点. ...

  6. 01 MySQL数据库安装(Windows+Mac)

    目录 MySQL数据库安装 Windows 1.主要版本简介 2.软件下载 3.文件目录简介 4.使用 4.1配置环境变量 4.2登录 制作MySQL服务端开机自启动 运行MySQL 4.3 密码修改 ...

  7. MySQL安装,使用问题汇总

    一,安装问题 mysqld install时出现:The service already exists! 报错原因:以前机器上装过mysql没有卸载干净 解决方案: C:\windows\system ...

  8. 反射、反射机制、类加载、Class类专题复习

    一.反射概念 1.反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法.反射在设计模式和框架底层都会用到. 2. ...

  9. scrapy爬取《坏蛋是怎样练成的4》

    scrapy具体介绍就不用说了,自己百度一下.或者参考以下文档 https://blog.csdn.net/u011054333/article/details/70165401 直接在cmd里运行 ...

  10. Eclipse插件开发demo

    一.安装 1. 下载安装JDk 2. 下载安装PDE(Plugin-in Development Environment) 访问eclipse官网,点击Download,选择Download Pack ...