2017-01-12 19 views
1

Я пытаюсь сделать статический анализ байт-кода в Prolog. Я использую библиотеку bcel для получения списка инструкций из MethodGen. Для aload_0 я получаю 0:aload_0[42](1)Нужна помощь, чтобы понять инструкцию Java Bytecode

Я понимаю, что aload_0 предназначен для загрузки 0-й локальной переменной. Но мне трудно понять следующие бит i.e [42](1). Также имеются другие инструкции, например:

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

Может кто-нибудь объяснить, что это такое? Был бы очень признателен!

+0

Обычный способ использования API Java, является запрос свойств объекта с помощью членов класса, чьи имена, как правило, очевидны, а не делать догадки о формате 'ToString()' вывод. Кроме того, [он задокументирован] (https://commons.apache.org/proper/commons-bcel/apidocs/org/apache/bcel/generic/Instruction.html#toString-boolean-): 'Длинный формат вывода: <имя опкода> "[" <номер кода операции> "]" "(" <длина инструкции> ")" ' – Holger

+0

@ Хольгер Спасибо за то, что поучили меня. Я проверил документацию, как я утверждал, и получил ответ, просто забыл отметить это здесь. –

ответ

2

42 - код операции для aload_0. Код операции invokespecial. 177 возврат и прочее. 8 после invokespecial, вероятно, является 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-): 'Длинный формат вывода: <имя кода операции>" ["<номер кода операции>"] "" ("<длина инструкции>") " "<" <константный пул index> ">" ', поэтому ваша догадка правильная, но OP должен читать документацию, а не спрашивать нас о догадках ... – Holger