java table 设置长度_Java字节码lookupswitch和tableswitch总指令长度

本文介绍了如何计算Java字节码中lookupswitch和tableswitch指令的总长度,包括填充、默认跳转偏移、匹配偏移对等要素。同时提到了wide指令的长度特性。
摘要由CSDN通过智能技术生成

使用给定的字节码,当遇到切换指令时,我想知道下一条指令的位置(不运行代码).为了做到这一点,我想我应该计算指令的总大小,包括跳转偏移或匹配偏移对.这可能吗?如果不是,怎么可能知道下一条指令在哪里?

此外,还有其他任何具有动态大小的字节码指令(它们的大小基于变量)吗?

tableswitch

tableswitch

<0-3 byte pad>

defaultbyte1

defaultbyte2

defaultbyte3

defaultbyte4

lowbyte1

lowbyte2

lowbyte3

lowbyte4

highbyte1

highbyte2

highbyte3

highbyte4

jump offsets...

lookupswitch

lookupswitch

<0-3 byte pad>

defaultbyte1

defaultbyte2

defaultbyte3

defaultbyte4

npairs1

npairs2

npairs3

npairs4

match-offset pairs...

解决方法:

您需要读取高和低(对于tableswitch)和npairs(对于loopkupswitch)的值.

此外,defaultbyte1始终从一个地址开始,该地址是当前方法开头的四个字节的倍数.在操作码之后立即需要0到3个字节之间的填充.

对于操作码,表格开关的长度等于1,对于填充,最多3个字节,默认跳跃偏移为4个字节,对于每个跳跃偏移,高4个字节为4个字节(其中有高 – 低1个).总共:

1 + p + 4 + 4 + 4 + 4*(high-low+1)

其中p是0到3之间的填充.

对于操作码,lookupswitch的长度等于1字节,对于填充,4字节用于默认跳跃偏移4字节用于每对匹配和跳跃偏移的对数(npairs)8字节.总共:

1 + p + 4 + 4 + 8*(npairs)

其中p是0到3之间的填充.

还有另一条指令wide,其长度可以是4或6个字节.如果以下操作码是iinc,则长度为6.否则,它为4.

标签:java,bytecode

来源: https://codeday.me/bug/20190829/1760377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值