Java bytecode lookupswitch 和 tableswitch 总指令长度
Java bytecode lookupswitch and tableswitch total instruction length
对于给定的字节码,当遇到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...
您需要阅读 high
和 low
的值(对于 tableswitch
)以及 npairs
的值(对于 loopkupswitch
) .
此外,defaultbyte1
始终从当前方法开头的四个字节的倍数的地址开始。在操作码之后需要立即在 0
和 3
字节之间进行填充。
tableswitch
的长度等于操作码 1 + 填充最多 3 个字节 + 默认跳转偏移量 4 个字节 + high
4 个字节 + [= 4 个字节13=] + 每个跳转偏移量 4 个字节(其中有 high-low+1
个)。总计:
1 + p + 4 + 4 + 4 + 4*(high-low+1)
其中 p
是 0
和 3
之间的填充。
lookupswitch
的长度等于操作码1个字节+填充最多3个字节+默认跳转偏移量4个字节+对数4个字节(npairs
) + 每对 match
和跳转偏移量 8 个字节。总计:
1 + p + 4 + 4 + 8*(npairs)
其中 p
是 0
和 3
之间的填充。
还有一条指令wide
,它的长度可以是 4 字节或 6 字节。如果下面的操作码是iinc
,那么长度就是6。否则就是4。
对于给定的字节码,当遇到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...
您需要阅读 high
和 low
的值(对于 tableswitch
)以及 npairs
的值(对于 loopkupswitch
) .
此外,defaultbyte1
始终从当前方法开头的四个字节的倍数的地址开始。在操作码之后需要立即在 0
和 3
字节之间进行填充。
tableswitch
的长度等于操作码 1 + 填充最多 3 个字节 + 默认跳转偏移量 4 个字节 + high
4 个字节 + [= 4 个字节13=] + 每个跳转偏移量 4 个字节(其中有 high-low+1
个)。总计:
1 + p + 4 + 4 + 4 + 4*(high-low+1)
其中 p
是 0
和 3
之间的填充。
lookupswitch
的长度等于操作码1个字节+填充最多3个字节+默认跳转偏移量4个字节+对数4个字节(npairs
) + 每对 match
和跳转偏移量 8 个字节。总计:
1 + p + 4 + 4 + 8*(npairs)
其中 p
是 0
和 3
之间的填充。
还有一条指令wide
,它的长度可以是 4 字节或 6 字节。如果下面的操作码是iinc
,那么长度就是6。否则就是4。