ASM 4.0 Tree API:InsnNodes中字节码的映射?

时间:2013-02-22 17:30:03

标签: java jvm bytecode java-bytecode-asm

大概是整个方法体被处理,并在包含一堆InsnList的{​​{1}}中转换,以及一些非字节码节点(如AbstractInsnNode,{{1等等)。 XXXNode类javadoc通常包含一些有用的信息(例如哪些操作码映射到此XXXNode),但映射似乎不是完全的,所以我不完全确定在所有情况下会发生什么:

  • FrameNode字节码会发生什么变化?是否会自动折叠到下一条指令中?据推测它确实如此,但我找不到任何明确说明
  • 的东西
  • 是否所有Ldc说明(LineNumberNodeWIDELDC)都映射到LdcInsnNodes?据推测他们这样做,但文档没有说

一般来说,是否有方便的java字节码映射 - > ASM课程?我正在对java字节码序列(即方法体)进行一些处理,并想检查我可能收到的所有字节码(大约200个左右)都映射到我正在处理的ASM数据结构。

1 个答案:

答案 0 :(得分:1)

是的,您选择最不发达国家的指示是正确的。

ASM不会将Java字节码中的操作码映射到API,如org.objectweb.asm.Opcodes接口的Java-doc(http://asm.ow2.org/asm40/javadoc/user/index.html

的描述中所述
  

public interface Opcodes

     

定义JVM操作码,访问标志和数组类型代码。这个   接口没有定义所有JVM操作码,因为有些操作码是   自动处理。例如,xLOAD和xSTORE操作码是   尽可能自动替换为xLOAD_n和xSTORE_n操作码。   因此,未在此定义xLOAD_n和xSTORE_n操作码   接口。同样对于LDC,由LDC_W或LDC2_W自动替换   必要时,WIDE,GOTO_W和JSR_W。

这转换为ASM中的其他API。

这也可以在这里确认:

  

首先请注意,ASM不能提供与原始字节码完全一对一的映射... - http://osdir.com/ml/java.objectweb.asm/2008-03/msg00031.html

对于问题的第二部分,您可以尝试使用常见问题解答中提到的ASMifer:http://asm.ow2.org/doc/faq.html#Q10。它将基本列出您必须使用ASM调用的Java指令来创建给定的ByteCode指令序列。