2017-01-12 5 views
1

Ich versuche statische Analyse von Bytecode in Prolog zu tun. Ich benutze die Bcel-Bibliothek, um Anweisungsliste von einem MethodGen zu erhalten. Für aload_0, bekomme ich 0:aload_0[42](1)Brauchen Sie Hilfe, Java Bytecode Anweisung zu verstehen

Ich verstehe aload_0 ist zum Laden 0. Lokalvariable gedacht. Aber mir fällt es schwer, die nächsten Bits zu verstehen, d. H. [42](1). Es ist auch dort für andere Anweisungen, zB:

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

Kann jemand bitte erklären, was diese sind ?. Würde es sehr zu schätzen wissen!

+0

Der normale Weg, eine Java-API zu verwenden, ist die Objekteigenschaften über die Klassenmitglieder abzufragen, deren Namen sind in der Regel selbsterklärend, anstatt Vermutungen über das Format des 'toString tun()' Ausgabe. Außerdem ist [dokumentiert] (https://commons.apache.org/proper/commons-bcel/apidocs/org/apache/bcel/generic/Instruction.html#toString-boolean-): 'Langes Ausgabeformat: "[" "]" "(" ")" ' – Holger

+0

@Holger Danke, dass Sie mich aufgeklärt haben. Ich hatte die Dokumentation überprüft, wie ich behauptete, und bekam die Antwort, nur vergaß es zu markieren, antwortete hier. –

Antwort

2

42 ist der Opcode für aload_0. 183 ist der Opcode für invokespecial. 177 ist zurück und so weiter. Die 8 nach InvokeSpecial ist wahrscheinlich die 16-Bit-Konstante Pool-Index, den der Befehl verwendet.

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

+0

Beachten Sie, dass das OP die korrekte Formatierung nicht ausführen konnte. Tatsächlich ist der String "invokespecial [183] ​​(3) 8", was [Dokumentation] (https://commons.apache.org/proper/common-bcel/apidocs) entspricht /org/apache/bcel/generic/CPInstruction.html#toString-boolean-): 'Langes Ausgabeformat: " [""] "" ("") " "<" ">" ', also ist Ihre Vermutung richtig, aber der OP sollte die Dokumentation lesen, anstatt uns nach Vermutungen zu fragen ... – Holger

Verwandte Themen