【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 指令,外加一个参数,用来表示需要存放的槽位位置

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java小白。。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值