Понять ByteCode, который печатает что-то - PullRequest
0 голосов
/ 08 декабря 2018

Пожалуйста, помогите, что этот байт-код будет печатать

BIPUSH 10
BIPUSH 7
IXOR
ISTORE 1
IINC 1 19
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V

1 Ответ

0 голосов
/ 08 декабря 2018

Я бы настоятельно рекомендовал прочитать спецификацию JVM, которая объясняет все.

Рассматривая ваш конкретный пример

BIPUSH 10

Это помещает 10 в стек

BIPUSH 7

Это помещает 7 в стек.Стек теперь 10 7

IXOR

Это xors верхних двух элементов.Стек теперь равен 10 ^ 7 = 13

ISTORE 1

. Здесь хранится верхний элемент в слоте локальной переменной 1. Стек теперь пуст, а локальные: [INVALID, 13]

IINC 1 19

Это увеличивает локальное значение 1 на 19. Теперь локальное значение [INVALID, 32]

GETSTATIC java/lang/System.out : Ljava/io/PrintStream;

Это помещает System.out в стек

ILOAD 1

Это загружает переменную встек

INVOKEVIRTUAL java/io/PrintStream.println (I)V

И это печатает.Таким образом, конечный результат - это печать 32.

Этот байт-код, вероятно, был сгенерирован Java-кодом в соответствии со следующими строками

int x = 10 ^ 7;
x += 19;
System.out.println(x);
...