gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:08:33 25 4
gpt4 key购买 nike

对于给定的字节码,当遇到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...

最佳答案

您需要读取highlow 的值(对于tableswitch)以及npairs 的值code>(对于 loopkupswitch)。

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

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

 1 + p + 4 + 4 + 4 + 4*(high-low+1)

其中 p03 之间的填充。

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

 1 + p + 4 + 4 + 8*(npairs)

其中 p03 之间的填充。

还有一条指令wide它的长度可以是 4 或 6 个字节。如果后面的操作码是iinc,则长度为6,否则为4。

关于Java 字节码 lookupswitch 和 tableswitch 总指令长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com