当前位置: 首页 > news >正文

【JVM笔记】加载与存储字节码指令

目录

局部变量压栈指令

常量入栈指令

出栈装入局部变量表指令


局部变量压栈指令

将一个局部变量加载到操作数栈:xload、xload_<n>(其中 x 为 i,l,f,d、a;n 为 0 到 3)

以尖括号结尾的(例如 iload_<n>)。这些指令助记符实际上代表了一组指令(例如 iload_ <n> 代表了 iload_ 0、iload_ 1、iload_ 2 和 iload_ 3 这几个指令)。这几组指令都是某个带有一个操作数的通用指令(例如 iload) 的特殊形式,对于这若干组特殊指令来说,它们表面上没有操作数,不需要进行取操作数的动作,但操作数都隐含在指令中

除此之外,它们的语义与原生的通用指令完全一致(例如 iload_ 0 的语义与操作数为 0 时的iload 指令语义完全一致)。在尖括号之间的字母指定了指令隐含操作数的数据类型,<n> 代表非负的整数, <i> 代表是 int 类型数据,<l> 代表 long 类型,<f> 代表 float 类型,<d> 代表 double 类型

操作 byte、char、 short 和 boolean 类型数据时,经常用 int 类型的指令来表示

常量入栈指令

ldc 系列:

接受两个 8 位参数,使用 ldc_w

如果要压入的元素是 long 或者 double 类型的,则使用 ldc2_w 指令

出栈装入局部变量表指令

出栈装入局部变量表指令用于将操作数栈中栈顶元素弹出后,装入局部变量表的指定位置,用于给局部变量赋值

这类指令主要以 store 的形式存在,比如 xstore(x 为 i、 1、f、d、a)、xstore_ n(x 为 i、1、f、d、a, n 为 0 至 3)

其中,指令 istore_ n 将从操作数栈中弹出一个整数,并把它赋值给局部变量索引 n 位置

指令 xstore 由于没有隐含参数信息,故需要提供一个 byte 类型的参数类指定目标局部变量表的位置

一般说来,类似像 store 这样的命令需要带一个参数,用来指明将弹出的元素放在局部变量表的第几个位置。但是,为了尽可能压缩指令大小,使用专门的 istore_ 1 指令表示将弹出的元素放置在局部变量表第 1 个位置。类似的还有 istore_ 0、istore_ 2、 istore_ 3, 它们分别表示从操作数栈顶弹出一个元素,存放在局部变量表第 0、2、3 个位置

由于局部变量表前几个位置总是非常常用,因此这种做法虽然增加了指令数量,但是可以大大压缩生成的字节码的体积。如果局部变量表很大,需要存储的槽位大于 3,那么可以使用 istore 指令,外加一个参数,用来表示需要存放的槽位位置

相关文章:

  • springboot社区再生资源上门回收平台毕业设计-附源码072049
  • React Router v6中的更新
  • xacro搭建ros仿真机器人(待更新)
  • Visual Studio C++ Hello World
  • 线程安全问题和多线程安全经典案例
  • IDEA2020创建JavaWeb项目并配置tomcat
  • Windows下小狼毫输入法(Rime)的安装与配置
  • java 调用C#语言写的dll文件代码 超详细过程
  • Java面试题11-ReentrantLock中的公平锁与非公平锁的底层实现
  • 股票行情查询易语言代码
  • STM32学习记录 -- 通用定时器的配置(TIM2-TIM5)
  • node搭建服务器
  • 域名解析信息易语言代码
  • 【GNN报告】蒙特利尔大学朱兆成:基于图神经网络的知识图谱推理
  • ATF启动(二):BL1
  • 【刷算法】求1+2+3+...+n
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • bootstrap创建登录注册页面
  • dva中组件的懒加载
  • FineReport中如何实现自动滚屏效果
  • git 常用命令
  • Javascripit类型转换比较那点事儿,双等号(==)
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript的使用你知道几种?(上)
  • nginx 配置多 域名 + 多 https
  • node和express搭建代理服务器(源码)
  • python学习笔记-类对象的信息
  • 反思总结然后整装待发
  • ------- 计算机网络基础
  • 驱动程序原理
  • 首页查询功能的一次实现过程
  • 思维导图—你不知道的JavaScript中卷
  • 由插件封装引出的一丢丢思考
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)C#调用WebService 基础
  • (转)Scala的“=”符号简介
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET CLR基本术语
  • .NET delegate 委托 、 Event 事件,接口回调
  • .Net Memory Profiler的使用举例
  • .net 设置默认首页
  • .NET 中的轻量级线程安全
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net接口调试与案例
  • .NET是什么
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?