Как работает bipush в JVM? - PullRequest
       85

Как работает bipush в JVM?

0 голосов
/ 04 мая 2018

Я понимаю, что iload принимает целые числа от -1 до 5, но как вы можете расширить на более высокие числа, используя инструкцию bipush? Как конкретное целое число хранится с байт-кодом?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

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

Наименьшее - это инструкция iconst_ *. Это только один байт, потому что значение закодировано в самом коде операции. iconst_1, iconst_2 и т. д. - это разные коды операций. Например, iconst_5 будет закодировано как байт 08.

Примечание: iload - это совершенно не связанная инструкция, используемая для загрузки значения локальной переменной. Вы, должно быть, думали о iconst _ *.

Далее следует bipush, который может выдавать константу в диапазоне от -128 до 127. Эта инструкция имеет длину два байта - первый байт является кодом операции, а второй байт представляет собой 8-разрядное целое число со знаком. Вы даже можете использовать его для вывода констант в диапазоне от -1 до 5, хотя это займет больше места в файле классов, чем необходимо. Например, bipush 5 будет закодировано как 10 05. (0x10 - это код операции для bipush)

Далее следует sipush, то есть то же самое, за исключением того, что оно хранит 16-битную константу вместо 8-битной константы, и, следовательно, длина инструкции составляет три байта. Код операции для sipush - 0x11, поэтому sipush 5 будет закодирован как трехбайтовая последовательность 11 00 05.

Вы можете задаться вопросом, как хранятся целочисленные константы, которые не помещаются в 16 битах. В этом случае компилятор создает записи в отдельном разделе файла классов, называемом пулом констант, и затем использует инструкцию ldc или ldc_w для ссылки на запись константы.

0 голосов
/ 04 мая 2018

Я думаю, что вы ищете раздел 2.11 JVMS , который касается представления инструкций. В частности, он использует очевидный порядок: код операции, сразу после которого следуют операнды в порядке, с прямым порядком байтов (как и все представления Java). В случае bipush это будет байт 0x10 , за которым следует буквальное значение.

...