使用给定的字节码,遇到switch
指令时,我想知道下一条指令的位置(不运行代码)。为了做到这一点,我想我应该计算指令的总大小,包括跳转偏移或匹配偏移对。这可能吗?如果不是,怎么知道下一条指令在哪里?
此外,是否还有其他具有动态大小的字节码指令(它们的大小基于变量)?
tableswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
lowbyte1
lowbyte2
lowbyte3
lowbyte4
highbyte1
highbyte2
highbyte3
highbyte4
jump offsets...
lookupswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
npairs1
npairs2
npairs3
npairs4
match-offset pairs...
答案 0 :(得分:5)
您需要阅读high
和low
(tableswitch
)的值和npairs
的值(loopkupswitch
)
此外,defaultbyte1
始终从一个地址开始,该地址是当前方法开头的四个字节的倍数。在操作码之后需要在0
和3
字节之间填充。
操作码的tableswitch
长度等于1 +填充最多3个字节+默认跳转偏移量为4个字节+ high
为4个字节+ {{1}为4个字节每个跳转偏移量+4个字节(它们有low
个)。总计:
high-low+1
其中 1 + p + 4 + 4 + 4 + 4*(high-low+1)
是p
和0
之间的填充。
3
的长度等于操作码的1个字节+最多3个字节用于填充+ 4个字节用于默认跳转偏移+ 4个字节用于对数(lookupswitch
)+每对npairs
和跳跃偏移量为8个字节。总计:
match
其中 1 + p + 4 + 4 + 8*(npairs)
是p
和0
之间的填充。
还有另一条指令wide
,其长度可以是4或6个字节。如果以下操作码是3
,则长度为6.否则,它是4。