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

Kik*_*api 3 java bytecode

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

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

tableswitch

tableswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
lowbyte1
lowbyte2
lowbyte3
lowbyte4
highbyte1
highbyte2
highbyte3
highbyte4
jump offsets...
Run Code Online (Sandbox Code Playgroud)

lookupswitch

lookupswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
npairs1
npairs2
npairs3
npairs4
match-offset pairs...
Run Code Online (Sandbox Code Playgroud)

dej*_*uth 5

你将需要阅读的价值观highlow(对tableswitch)和价值npairs(对loopkupswitch).

此外,defaultbyte1始终从当前方法开头的四个字节的倍数开始.在操作码之后立即需要填充03字节之间的填充.

tableswitch对于操作码,长度等于1 +对于填充,最多3个字节,对于默认跳跃偏移,4个字节,high+ 4个字节,low+ 4个字节,+ 4个字节,每个跳跃偏移(有high-low+1它们).总共:

 1 + p + 4 + 4 + 4 + 4*(high-low+1)
Run Code Online (Sandbox Code Playgroud)

p之间的填充在哪里.03

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

 1 + p + 4 + 4 + 8*(npairs)
Run Code Online (Sandbox Code Playgroud)

p之间的填充在哪里.03

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