我正在嘗試在Prolog中對字節碼進行靜態分析。我正在使用bcel庫從MethodGen獲取指令列表。對於aload_0,我得到 0:aload_0[42](1)
需要幫助瞭解Java字節碼說明
我知道aload_0
是爲了加載第0個局部變量。但我很難理解下一個比特,即[42](1)
。這也是其他指令,例如:
invokespecial[183](3) 8
return[177](1)
有人可以請解釋那些是什麼?將非常感謝它!
我正在嘗試在Prolog中對字節碼進行靜態分析。我正在使用bcel庫從MethodGen獲取指令列表。對於aload_0,我得到 0:aload_0[42](1)
需要幫助瞭解Java字節碼說明
我知道aload_0
是爲了加載第0個局部變量。但我很難理解下一個比特,即[42](1)
。這也是其他指令,例如:
invokespecial[183](3) 8
return[177](1)
有人可以請解釋那些是什麼?將非常感謝它!
42
是aload_0
的操作碼。 183
是invokespecial
的操作碼。 177
是回報等。 invokespecial之後的8
可能是該指令使用的16位常量池索引。
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-7.html
請注意,OP沒有做正確的格式化,字符串實際上是'invokespecial [183](3)8',它匹配[它的文檔](https://commons.apache.org/proper/commons-bcel/apidocs /org/apache/bcel/generic/CPInstruction.html#toString-boolean-):'長輸出格式:<操作碼名稱>「[」<操作碼編號>「]」「(」<指令長度>「)」 「<」<常量池索引>「>」',所以你的猜測是正確的,但OP應該閱讀文檔,而不是要求我們猜測...... – Holger
使用Java API的正常的方式,是通過類成員,他們的名字通常是不言自明的,而不是做猜測關於'的toString的格式來查詢對象屬性()'輸出。除此之外,[它被記錄](https://commons.apache.org/proper/commons-bcel/apidocs/org/apache/bcel/generic/Instruction.html#toString-boolean-):'長輸出格式: <操作碼名稱>「[」<操作碼編號>「]」「(」<指令長度>「)」' – Holger
@Holger謝謝您的啓發。我檢查了文檔並按照我的說法得到了答案,只是忘記標記它在這裏回答。 –