2017-01-12 71 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