使用给定的字节码,当遇到切换指令时,我想知道下一条指令的位置(不运行代码).为了做到这一点,我想我应该计算指令的总大小,包括跳转偏移或匹配偏移对.这可能吗?如果不是,怎么可能知道下一条指令在哪里?
此外,还有其他任何具有动态大小的字节码指令(它们的大小基于变量)吗?
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