Отсутствуют номера инструкций в выводе javap

Каждый раз, когда я пытаюсь понять дизассемблированный код скомпилированного Java-файла, я задаюсь вопросом, почему некоторые номера инструкций отсутствуют.

Небольшой пример:

Я разобрал ($ javap -c HelloWorld) простой класс HelloWorld. Вот результат:

Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return        
}

Как видите, отсутствуют инструкции 3 и 4 в конструкторе и некоторые в методе main.

Кто-нибудь знает, почему эти номера инструкций отсутствуют? Есть ли какие-то инструкции байт-кода, которые по какой-то причине скрыты?


person Gian U.    schedule 21.03.2014    source источник


Ответы (2)


«Отверстия» — это места, где проходят аргументы текущей инструкции, см. Спецификацию виртуальной машины Java. Он содержит полный список байт-кодов в главе 6.

Например, invokevirtual и invokespecial оба принимают 2 аргумента, поэтому следующий код операции будет нашел 3 байта позже. В обоих этих случаях параметры (indexbyte1 и indexbyte2) необходимы для вычисления позиции в пуле констант как (indexbyte1 << 8) | indexbyte2)

Javap ищет эти значения для вас, это ссылка в комментариях после фактической инструкции.

person fvu    schedule 21.03.2014

Это не номера инструкций, это смещение инструкции в байтах относительно метода.

Я все еще ищу официальную документацию по этому вопросу, но эта ссылка подтверждает это.

person yshavit    schedule 21.03.2014