2017-01-12 35 views
1

我正在尝试在Prolog中对字节码进行静态分析。我正在使用bcel库从MethodGen获取指令列表。对于aload_0,我得到 0:aload_0[42](1)需要帮助了解Java字节码说明

我知道aload_0是为了加载第0个局部变量。但我很难理解下一个比特,即[42](1)。这也是其他指令,例如:

invokespecial[183](3) 8 
return[177](1) 

有人可以请解释那些是什么?将非常感谢它!

+0

使用Java API的正常的方式,是通过类成员,他们的名字通常是不言自明的,而不是做猜测关于'的toString的格式来查询对象属性()'输出。除此之外,[它被记录](https://commons.apache.org/proper/commons-bcel/apidocs/org/apache/bcel/generic/Instruction.html#toString-boolean-):'长输出格式: <操作码名称>“[”<操作码编号>“]”“(”<指令长度>“)”' – Holger

+0

@Holger谢谢您的启发。我检查了文档并按照我的说法得到了答案,只是忘记标记它在这里回答。 –

回答

2

42aload_0的操作码。 183invokespecial的操作码。 177是回报等。 invokespecial之后的8可能是该指令使用的16位常量池索引。

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-7.html

+0

请注意,OP没有做正确的格式化,字符串实际上是'invokespecial [183]​​(3)8',它匹配[它的文档](https://commons.apache.org/proper/commons-bcel/apidocs /org/apache/bcel/generic/CPInstruction.html#toString-boolean-):'长输出格式:<操作码名称>“[”<操作码编号>“]”“(”<指令长度>“)” “<”<常量池索引>“>”',所以你的猜测是正确的,但OP应该阅读文档,而不是要求我们猜测...... – Holger