2017-01-12 6 views
1

Prolog에서 바이트 코드의 정적 분석을 수행하려고합니다. bcel 라이브러리를 사용하여 MethodGen에서 명령어 목록을 가져 왔습니다. aload_0에 대해서는 0:aload_0[42](1)Java 바이트 코드 명령어를 이해하는 데 도움이 필요합니다.

은 0 번째 로컬 변수를로드하는 의미입니다. 그러나 다음 비트 (예 : [42](1))를 이해하는 데 어려움을 겪고 있습니다. 예를 들어 다른 지침에도 해당됩니다.

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

누군가가 설명해 주실 수 있습니까? 고맙겠습니다!

+0

자바 API를 사용하는 일반적인 방법은, 이름이 일반적으로 단정, 오히려'된 toString 형식에 대해 추측하는 것보다있는 클래스 멤버를 통해 개체 속성을 조회하는 것입니다()' 산출. 그 외에, [문서화되어 있습니다] (https://commons.apache.org/proper/commons-bcel/apidocs/org/apache/bcel/generic/Instruction.html#toString-boolean-) :'장시간 출력 형식 : ""] ""("<길이>") "' – Holger

+0

@Holger 나에게 계몽 해 주셔서 감사합니다. 내가 주장한대로 설명서를 확인하고 답변을 얻었습니다. 여기에 답변을 표시하는 것을 잊어 버렸습니다. –

답변

2

42aload_0의 opcode입니다. 183invokespecial의 연산 코드입니다. 177이 반환됩니다. invokespecial 이후의 8은 아마도 명령어가 사용하는 16 비트 상수 풀 인덱스 일 것입니다.

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

+0

OP가 올바른 형식을 지정하지 못했음을 주목하십시오. String은 실제로 [invokespecial [183] ​​(3) 8'이고, [해당 문서]와 일치합니다 (https://commons.apache.org/proper/commons-bcel/apidocs "" "]" "("<길이의 명령어> ") "<" ">"', 그래서 당신의 추측은 맞지만 OP는 우리에게 추측을 요구하는 대신 문서를 읽어야합니다 ... – Holger