Java字节码lookupswitch和tableswitch总指令长度

时间:2016-02-05 11:19:15

标签: java bytecode

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

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

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...

1 个答案:

答案 0 :(得分:5)

您需要阅读highlowtableswitch)的值和npairs的值(loopkupswitch

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

操作码的tableswitch长度等于1 +填充最多3个字节+默认跳转偏移量为4个字节+ high为4个字节+ {{1}为4个字节每个跳转偏移量+4个字节(它们有low个)。总计:

high-low+1

其中 1 + p + 4 + 4 + 4 + 4*(high-low+1) p0之间的填充。

3的长度等于操作码的1个字节+最多3个字节用于填充+ 4个字节用于默认跳转偏移+ 4个字节用于对数(lookupswitch)+每对npairs和跳跃偏移量为8个字节。总计:

match

其中 1 + p + 4 + 4 + 8*(npairs) p0之间的填充。

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