- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于给定的字节码,当遇到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
的值code>(对于 loopkupswitch
)。
此外,defaultbyte1
始终从当前方法开头的四个字节的倍数的地址开始。在操作码之后需要立即在 0
和 3
字节之间进行填充。
tableswitch
的长度等于操作码 1 + 填充最多 3 个字节 + 默认跳转偏移量 4 个字节 + high
4 个字节 + 4 low
的字节 + 每个跳转偏移量的 4 个字节(其中有 high-low+1
)。总计:
1 + p + 4 + 4 + 4 + 4*(high-low+1)
其中 p
是 0
和 3
之间的填充。
lookupswitch
的长度等于操作码 1 个字节 + 填充最多 3 个字节 + 默认跳转偏移量 4 个字节 + 对数 4 个字节 (npairs
) + 每对匹配
和跳转偏移8个字节。总计:
1 + p + 4 + 4 + 8*(npairs)
其中 p
是 0
和 3
之间的填充。
还有一条指令wide
它的长度可以是 4 或 6 个字节。如果后面的操作码是iinc
,则长度为6,否则为4。
关于Java 字节码 lookupswitch 和 tableswitch 总指令长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222839/
我目前正在使用 BCEL 检测字节码。在 BCEL API 中,LOOKUPSWITCH 和 TABLESWITCH 这两种指令类型(package org.apache.bcel.generic)正
Scala 2.11 将相对密集的 Int 范围内的 match 表达式编译成 lookupswitch: lookupswitch { // 21 -12: 200 -11: 200
对于给定的字节码,当遇到switch 指令时,我想知道下一条指令在哪里(无需运行代码)。为了做到这一点,我在想我应该计算指令的总大小,包括跳转偏移量或匹配偏移量对。这可能吗?如果不是,怎么可能知道下一
以下代码返回给定的 String s 是否等于任何其他硬编码字符串。该方法使用 switch 语句来执行此操作: public class SwitchOnString { public st
我在理解 Java 字节码中的 LookUpSwitch 和 TableSwitch 时有些困难。 如果我理解得很好,LookUpSwitch 和 TableSwitch 都对应于 switch Ja
我是一名优秀的程序员,十分优秀!