Список инструкций байт-кода Java
Это список инструкций, составляющих байт-код Java , абстрактный машинный язык, который в конечном итоге выполняется виртуальной машиной Java . [ 1 ] Байт-код Java генерируется на основе языков, работающих на платформе Java , в первую очередь языка программирования Java .
Обратите внимание, что любое указанное «значение» относится к 32-битному int согласно набору инструкций Java.
Мнемоника | Код операции (в шестнадцатеричном формате ) |
Код операции (в двоичном формате) | Другие байты [число]: [метки операндов] |
Куча [до] → [после] |
Описание |
---|---|---|---|---|---|
загрузит | 32 | 0011 0010 | ссылка на массив, индекс → значение | загрузить в стек ссылку из массива | |
магазин | 53 | 0101 0011 | ссылка на массив, индекс, значение → | сохранить ссылку в массиве | |
aconst_null | 01 | 0000 0001 | → ноль | поместить нулевую ссылку в стек | |
загрузить | 19 | 0001 1001 | 1: индекс | → ссылка на объект | загрузить ссылку в стек из локальной переменной #index |
aload_0 | 2а | 0010 1010 | → ссылка на объект | загрузить ссылку в стек из локальной переменной 0 | |
aload_1 | 2б | 0010 1011 | → ссылка на объект | загрузить ссылку в стек из локальной переменной 1 | |
aload_2 | 2с | 0010 1100 | → ссылка на объект | загрузить ссылку в стек из локальной переменной 2 | |
aload_3 | 2д | 0010 1101 | → ссылка на объект | загрузить ссылку в стек из локальной переменной 3 | |
Аневаррей | др. | 1011 1101 | 2: индексный байт1, индексный байт2 | счетчик → ссылка на массив | создайте новый массив ссылок длины и типа компонента, идентифицированного индексом ссылки на класс ( индексный байт1 << 8 | indexbyte2 ) в пуле констант |
вернуться | б0 | 1011 0000 | ссылка на объект → [пусто] | вернуть ссылку из метода | |
длина массива | быть | 1011 1110 | ссылка на массив → длина | получить длину массива | |
ястреб-тетеревятник | 3а | 0011 1010 | 1: индекс | ссылка на объект → | сохранить ссылку в локальную переменную #index |
ястреб-тетеревятник_0 | 4б | 0100 1011 | ссылка на объект → | сохранить ссылку в локальную переменную 0 | |
ястреб-тетеревятник_1 | 4с | 0100 1100 | ссылка на объект → | сохранить ссылку в локальную переменную 1 | |
ястреб-тетеревятник_2 | 4д | 0100 1101 | ссылка на объект → | сохранить ссылку в локальную переменную 2 | |
ястреб-тетеревятник_3 | 4е | 0100 1110 | ссылка на объект → | сохранить ссылку в локальную переменную 3 | |
бросать | парень | 1011 1111 | ссылка на объект → [пусто], ссылка на объект | выдает ошибку или исключение (обратите внимание, что остальная часть стека очищается, остается только ссылка на Throwable) | |
загрузка | 33 | 0011 0011 | ссылка на массив, индекс → значение | загрузить байтовое или логическое значение из массива | |
ставки | 54 | 0101 0100 | ссылка на массив, индекс, значение → | сохранить байтовое или логическое значение в массиве | |
бипуш | 10 | 0001 0000 | 1: байт | → ценность | поместить байт в стек как целочисленное значение |
точка останова | что | 1100 1010 | зарезервировано для точек останова в отладчиках Java; не должно появляться ни в одном файле класса | ||
груз | 34 | 0011 0100 | ссылка на массив, индекс → значение | загрузить символ из массива | |
бобер | 55 | 0101 0101 | ссылка на массив, индекс, значение → | сохранить символ в массиве | |
проверка | с0 | 1100 0000 | 2: индексный байт1, индексный байт2 | ссылка на объект → ссылка на объект | проверяет, относится ли ссылка к объекту определенного типа, ссылка на класс которого находится в пуле констант по индексу ( индексный байт1 << 8 | индексбайт2 ) |
d2f | 90 | 1001 0000 | значение → результат | преобразовать двойное число в число с плавающей запятой | |
d2i | 8е | 1000 1110 | значение → результат | преобразовать двойное число в целое число | |
d2l | 8 ф | 1000 1111 | значение → результат | преобразовать двойное значение в длинное | |
отец | 63 | 0110 0011 | значение1, значение2 → результат | добавить два дубля | |
далоад | 31 | 0011 0001 | ссылка на массив, индекс → значение | загрузить двойной из массива | |
дасторе | 52 | 0101 0010 | ссылка на массив, индекс, значение → | сохранить двойное значение в массиве | |
dcmpg | 98 | 1001 1000 | значение1, значение2 → результат | сравнить два дубля, 1 на NaN | |
dcmpl | 97 | 1001 0111 | значение1, значение2 → результат | сравнить два дубля, -1 на NaN | |
dconst_0 | 0е | 0000 1110 | → 0.0 | поместите константу 0.0 ( double ) в стек | |
dconst_1 | 0ф | 0000 1111 | → 1.0 | поместите константу 1.0 ( double ) в стек | |
нет | 6ф | 0110 1111 | значение1, значение2 → результат | разделить два дубля | |
загрузить | 18 | 0001 1000 | 1: индекс | → ценность | загрузить двойное значение из локальной переменной #index |
dload_0 | 26 | 0010 0110 | → ценность | загрузить двойное значение из локальной переменной 0 | |
dload_1 | 27 | 0010 0111 | → ценность | загрузить двойное значение из локальной переменной 1 | |
dload_2 | 28 | 0010 1000 | → ценность | загрузить двойное значение из локальной переменной 2 | |
dload_3 | 29 | 0010 1001 | → ценность | загрузить двойное значение из локальной переменной 3 | |
Мистер | 6б | 0110 1011 | значение1, значение2 → результат | умножить два двойных числа | |
сегодня | 77 | 0111 0111 | значение → результат | отрицать двойное значение | |
трамвай | 73 | 0111 0011 | значение1, значение2 → результат | получить остаток от деления между двумя даблами | |
вернуться | из | 1010 1111 | значение → [пусто] | вернуть двойное значение из метода | |
магазин | 39 | 0011 1001 | 1: индекс | значение → | сохранить двойное значение в локальной переменной #index |
dstore_0 | 47 | 0100 0111 | значение → | сохранить двойное значение в локальной переменной 0 | |
dstore_1 | 48 | 0100 1000 | значение → | сохранить двойное значение в локальной переменной 1 | |
dstore_2 | 49 | 0100 1001 | значение → | сохранить двойное значение в локальной переменной 2 | |
dstore_3 | 4а | 0100 1010 | значение → | сохранить двойное значение в локальной переменной 3 | |
dsub | 67 | 0110 0111 | значение1, значение2 → результат | вычесть дубль из другого | |
обман | 59 | 0101 1001 | ценность → ценность, ценность | дублировать значение на вершине стека | |
дубликат_x1 | 5а | 0101 1010 | значение2, значение1 → значение1, значение2, значение1 | вставьте копию верхнего значения в стек на два значения сверху. значение1 и значение2 не должны иметь тип double или long. | |
дубликат_x2 | 5б | 0101 1011 | значение3, значение2, значение1 → значение1, значение3, значение2, значение1 | вставьте копию верхнего значения в стек два (если значение2 имеет двойное или длинное значение, оно также занимает запись значения3) или три значения (если значение2 не является ни двойным, ни длинным) сверху | |
дубликат2 | 5с | 0101 1100 | {значение2, значение1} → {значение2, значение1}, {значение2, значение1} | дублировать два верхних слова стека (два значения, если значение value1 не двойное и не длинное; одно значение, если значение value1 двойное или длинное) | |
dup2_x1 | 5д | 0101 1101 | значение3, {значение2, значение1} → {значение2, значение1}, значение3, {значение2, значение1} | продублируйте два слова и вставьте их под третье слово (см. объяснение выше) | |
dup2_x2 | 5е | 0101 1110 | {значение4, значение3}, {значение2, значение1} → {значение2, значение1}, {значение4, значение3}, {значение2, значение1} | продублируйте два слова и вставьте под четвертое слово | |
f2d | 8д | 1000 1101 | значение → результат | преобразовать число с плавающей запятой в двойное | |
f2i | 8б | 1000 1011 | значение → результат | преобразовать число с плавающей запятой в целое число | |
f2l | 8с | 1000 1100 | значение → результат | преобразовать число с плавающей запятой в длинное | |
причуда | 62 | 0110 0010 | значение1, значение2 → результат | добавить два поплавка | |
фалоад | 30 | 0011 0000 | ссылка на массив, индекс → значение | загрузить число с плавающей запятой из массива | |
быстрый | 51 | 0101 0001 | ссылка на массив, индекс, значение → | хранить число с плавающей запятой в массиве | |
fcmpg | 96 | 1001 0110 | значение1, значение2 → результат | сравнить два числа с плавающей запятой, 1 на NaN | |
fcmpl | 95 | 1001 0101 | значение1, значение2 → результат | сравнить два числа с плавающей запятой, -1 на NaN | |
fconst_0 | 0б | 0000 1011 | → 0,0ф | поместите 0.0f в стек | |
fconst_1 | 0с | 0000 1100 | → 1.0ф | поместите 1.0f в стек | |
fconst_2 | 0д | 0000 1101 | → 2.0ф | поместите 2.0f в стек | |
fdiv | 6е | 0110 1110 | значение1, значение2 → результат | разделить два числа с плавающей запятой | |
загружать | 17 | 0001 0111 | 1: индекс | → ценность | загрузить значение с плавающей запятой из локальной переменной #index |
fload_0 | 22 | 0010 0010 | → ценность | загрузить значение с плавающей запятой из локальной переменной 0 | |
fload_1 | 23 | 0010 0011 | → ценность | загрузить значение с плавающей запятой из локальной переменной 1 | |
fload_2 | 24 | 0010 0100 | → ценность | загрузить значение с плавающей запятой из локальной переменной 2 | |
fload_3 | 25 | 0010 0101 | → ценность | загрузить значение с плавающей запятой из локальной переменной 3 | |
фм | 6а | 0110 1010 | значение1, значение2 → результат | умножить два числа с плавающей запятой | |
фнег | 76 | 0111 0110 | значение → результат | отрицать число с плавающей запятой | |
вперед | 72 | 0111 0010 | значение1, значение2 → результат | получить остаток от деления между двумя числами с плавающей запятой | |
возвращаться | но | 1010 1110 | значение → [пусто] | вернуть число с плавающей запятой | |
fstore | 38 | 0011 1000 | 1: индекс | значение → | сохранить значение с плавающей запятой в локальной переменной #index |
fstore_0 | 43 | 0100 0011 | значение → | сохранить значение с плавающей запятой в локальной переменной 0 | |
fstore_1 | 44 | 0100 0100 | значение → | сохранить значение с плавающей запятой в локальную переменную 1 | |
fstore_2 | 45 | 0100 0101 | значение → | сохранить значение с плавающей запятой в локальную переменную 2 | |
fstore_3 | 46 | 0100 0110 | значение → | сохранить значение с плавающей запятой в локальную переменную 3 | |
fsub | 66 | 0110 0110 | значение1, значение2 → результат | вычесть два числа с плавающей запятой | |
получить поле | б4 | 1011 0100 | 2: индексный байт1, индексный байт2 | ссылка на объект → значение | поля получить значение объекта objectref , где поле идентифицируется ссылкой на поле в индексе пула констант ( индексный байт1 << 8 | индексбайт2 ) |
получить статический | б2 | 1011 0010 | 2: индексный байт1, индексный байт2 | → ценность | статического поля получить значение класса, где поле идентифицируется ссылкой на поле в индексе пула констант ( индексный байт1 << 8 | индексбайт2 ) |
перейти к | a7 | 1010 0111 | 2: байт1, байт2 | [без изменений] | переходит к другой инструкции по смещению ветвления (короткое со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
goto_w | с8 | 1100 1000 | 4: байт1, байт2, байт3, байт4. | [без изменений] | переходит к другой инструкции по смещению ветвления (знаковое целое число, созданное из беззнаковых байтов веткабайт1 << 24 | веткабайт2 << 16 | веткабайт3 << 8 | веткабайт4 ) |
i2b | 91 | 1001 0001 | значение → результат | преобразовать целое число в байт | |
i2c | 92 | 1001 0010 | значение → результат | преобразовать int в символ | |
i2d | 87 | 1000 0111 | значение → результат | преобразовать int в double | |
i2f | 86 | 1000 0110 | значение → результат | преобразовать int в число с плавающей запятой | |
i2l | 85 | 1000 0101 | значение → результат | преобразовать int в long | |
i2s | 93 | 1001 0011 | значение → результат | преобразовать целое число в короткое | |
и т. д. | 60 | 0110 0000 | значение1, значение2 → результат | добавить два целых числа | |
загрузить | 2е | 0010 1110 | ссылка на массив, индекс → значение | загрузить int из массива | |
я ианд | 7е | 0111 1110 | значение1, значение2 → результат | выполнить побитовое И над двумя целыми числами | |
магазин | 4ф | 0100 1111 | ссылка на массив, индекс, значение → | сохранить int в массиве | |
iconst_m1 | 02 | 0000 0010 | → -1 | загрузить значение int -1 в стек | |
iconst_0 | 03 | 0000 0011 | → 0 | загрузить значение int 0 в стек | |
iconst_1 | 04 | 0000 0100 | → 1 | загрузить значение int 1 в стек | |
iconst_2 | 05 | 0000 0101 | → 2 | загрузить значение int 2 в стек | |
iconst_3 | 06 | 0000 0110 | → 3 | загрузить значение int 3 в стек | |
iconst_4 | 07 | 0000 0111 | → 4 | загрузить значение int 4 в стек | |
iconst_5 | 08 | 0000 1000 | → 5 | загрузить значение int 5 в стек | |
идив | 6с | 0110 1100 | значение1, значение2 → результат | разделить два целых числа | |
if_acmpeq | а5 | 1010 0101 | 2: байт1, байт2 | значение1, значение2 → | если ссылки равны, перейти к инструкции по смещению ветвления (короткое со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
if_acmpne | а6 | 1010 0110 | 2: байт1, байт2 | значение1, значение2 → | если ссылки не равны, перейти к инструкции по смещению ветвления (короткое со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
if_icmpeq | 9ф | 1001 1111 | 2: байт1, байт2 | значение1, значение2 → | если целые числа равны, перейти к инструкции по смещению ветвления (короткое со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
if_icmpge | а2 | 1010 0010 | 2: байт1, байт2 | значение1, значение2 → | если значение1 больше или равно значению2 , перейти к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
if_icmpgt | а3 | 1010 0011 | 2: байт1, байт2 | значение1, значение2 → | если значение1 больше, чем значение2 , перейти к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
if_icmple | a4 | 1010 0100 | 2: байт1, байт2 | значение1, значение2 → | если значение1 меньше или равно значению2 , перейти к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
if_icmplt | а1 | 1010 0001 | 2: байт1, байт2 | значение1, значение2 → | если значение1 меньше значения2 , перейти к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
if_icmpne | а0 | 1010 0000 | 2: байт1, байт2 | значение1, значение2 → | если целые числа не равны, переход к инструкции по смещению ветвления (короткое со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
ifeq | 99 | 1001 1001 | 2: байт1, байт2 | значение → | если значение равно 0, перейти к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
если бы | 9с | 1001 1100 | 2: байт1, байт2 | значение → | если значение больше или равно 0, переход к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
если бы | 9 дней | 1001 1101 | 2: байт1, байт2 | значение → | если значение больше 0, переход к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
если | 9е | 1001 1110 | 2: байт1, байт2 | значение → | если значение меньше или равно 0, перейти к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
если | 9б | 1001 1011 | 2: байт1, байт2 | значение → | если значение меньше 0, переход к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
еслине | 9а | 1001 1010 | 2: байт1, байт2 | значение → | если значение не равно 0, перейти к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
еслинонуль | с7 | 1100 0111 | 2: байт1, байт2 | значение → | если значение не равно нулю, перейти к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
еслинуль | с6 | 1100 0110 | 2: байт1, байт2 | значение → | если значение равно нулю, перейти к инструкции по смещению ветвления (короткое значение со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | веткабайт2 ) |
Inc. | 84 | 1000 0100 | 2: индекс, константа | [Без изменений] | увеличить локальную переменную #index на байт со знаком const |
загрузить | 15 | 0001 0101 | 1: индекс | → ценность | int загрузить значение из локальной переменной #index |
iload_0 | 1а | 0001 1010 | → ценность | int загрузить значение из локальной переменной 0 | |
iload_1 | 1б | 0001 1011 | → ценность | int загрузить значение из локальной переменной 1 | |
iload_2 | 1с | 0001 1100 | → ценность | int загрузить значение из локальной переменной 2 | |
iload_3 | 1д | 0001 1101 | → ценность | int загрузить значение из локальной переменной 3 | |
импдеп1 | фе | 1111 1110 | зарезервировано для операций, зависящих от реализации, в отладчиках; не должно появляться ни в одном файле класса | ||
импдеп2 | фф | 1111 1111 | зарезервировано для операций, зависящих от реализации, в отладчиках; не должно появляться ни в одном файле класса | ||
низкий | 68 | 0110 1000 | значение1, значение2 → результат | умножить два целых числа | |
ineg | 74 | 0111 0100 | значение → результат | отрицать целое число | |
экземпляр | с1 | 1100 0001 | 2: индексный байт1, индексный байт2 | ссылка на объект → результат | определяет, имеет ли объект objectref заданный тип, идентифицируемый индексом ссылки на класс в пуле констант ( индексный байт1 << 8 | индексбайт2 ) |
вызыватьдинамический | нет | 1011 1010 | 4: индексный байт1, индексный байт2, 0, 0 | [arg1, arg2, ...] → результат | вызывает динамический метод и помещает результат в стек (может быть пустым); метод идентифицируется по индексу ссылки на метод в пуле констант ( индексный байт1 << 8 | индексбайт2 ) |
вызватьинтерфейс | б9 | 1011 1001 | 4: индексный байт1, индексныйбайт2, счетчик, 0 | objectref, [arg1, arg2, ...] → результат | вызывает метод интерфейса объекта objectref и помещает результат в стек (может быть недействительным); метод интерфейса идентифицируется по индексу ссылки на метод в пуле констант ( индексный байт1 << 8 | индексбайт2 ) |
вызватьспециальный | b7 | 1011 0111 | 2: индексный байт1, индексный байт2 | objectref, [arg1, arg2, ...] → результат | вызвать метод экземпляра объекта objectref и поместить результат в стек (может быть недействительным); метод идентифицируется по индексу ссылки на метод в пуле констант ( индексный байт1 << 8 | индексбайт2 ) |
вызватьстатический | б8 | 1011 1000 | 2: индексный байт1, индексный байт2 | [arg1, arg2, ...] → результат | вызвать статический метод и поместить результат в стек (может быть пустым); метод идентифицируется по индексу ссылки на метод в пуле констант ( индексный байт1 << 8 | индексбайт2 ) |
вызвать виртуальный | б6 | 1011 0110 | 2: индексный байт1, индексный байт2 | objectref, [arg1, arg2, ...] → результат | вызвать виртуальный метод для ссылки на объект и поместить результат в стек (может быть недействительным); метод идентифицируется по индексу ссылки на метод в пуле констант ( индексный байт1 << 8 | индексбайт2 ) |
йор | 80 | 1000 0000 | значение1, значение2 → результат | побитовое целое ИЛИ | |
Ирем | 70 | 0111 0000 | значение1, значение2 → результат | логический остаток | |
возвращаться | и | 1010 1100 | значение → [пусто] | вернуть целое число из метода | |
работа | 78 | 0111 1000 | значение1, значение2 → результат | внутренний сдвиг влево | |
Ишр | 7а | 0111 1010 | значение1, значение2 → результат | int арифметический сдвиг вправо | |
хранить | 36 | 0011 0110 | 1: индекс | значение → | int сохранить значение в переменную #index |
istore_0 | 3б | 0011 1011 | значение → | int сохранить значение в переменную 0 | |
istore_1 | 3с | 0011 1100 | значение → | int сохранить значение в переменную 1 | |
istore_2 | 3d | 0011 1101 | значение → | int сохранить значение в переменную 2 | |
istore_3 | 3е | 0011 1110 | значение → | int сохранить значение в переменную 3 | |
isub | 64 | 0110 0100 | значение1, значение2 → результат | целое вычитание | |
юшр | 7с | 0111 1100 | значение1, значение2 → результат | int логический сдвиг вправо | |
Игорь | 82 | 1000 0010 | значение1, значение2 → результат | int xor | |
jsr † | а8 | 1010 1000 | 2: байт1, байт2 | → адрес | переход к подпрограмме по смещению ветвления (короткое со знаком, созданное из беззнаковых байтов веткабайт1 << 8 | Branchbyte2 ) и поместите адрес возврата в стек. |
jsr_w † | с9 | 1100 1001 | 4: байт1, байт2, байт3, байт4. | → адрес | переход к подпрограмме по смещению ветвления (знаковое целое число, созданное из беззнаковых байтов веткабайт1 << 24 | веткабайт2 << 16 | веткабайт3 << 8 | Branchbyte4 ) и поместите адрес возврата в стек. |
л2д | 8а | 1000 1010 | значение → результат | преобразовать длинное значение в двойное | |
л2ф | 89 | 1000 1001 | значение → результат | преобразовать long в float | |
л2и | 88 | 1000 1000 | значение → результат | преобразовать long в int | |
парень | 61 | 0110 0001 | значение1, значение2 → результат | добавить два длинных слова | |
загрузить | 2ф | 0010 1111 | ссылка на массив, индекс → значение | загрузить long из массива | |
земля | 7ф | 0111 1111 | значение1, значение2 → результат | побитовое И двух длинных значений | |
Ластор | 50 | 0101 0000 | ссылка на массив, индекс, значение → | сохранить длинное значение в массиве | |
lcmp | 94 | 1001 0100 | значение1, значение2 → результат | нажмите 0, если два длинных значения одинаковы, 1, если значение 1 больше значения 2, -1 в противном случае | |
lconst_0 | 09 | 0000 1001 | → 0Л | поместите 0L (число ноль с типом long ) в стек | |
lconst_1 | 0а | 0000 1010 | → 1л | поместите 1L (номер один с типом long ) в стек | |
ООО | 12 | 0001 0010 | 1: индекс | → ценность | поместите константу #index из пула констант (String, int, float, Class, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle или динамически вычисляемую константу) в стек |
ldc_w | 13 | 0001 0011 | 2: индексный байт1, индексный байт2 | → ценность | помещать константу #index из пула констант (String, int, float, Class, java.lang.invoke.MethodType, java.lang.invoke.MethodHandle или динамически вычисляемую константу) в стек (широкий индекс создается как индексный байт1 << 8 | индексбайт2 ) |
ldc2_w | 14 | 0001 0100 | 2: индексный байт1, индексный байт2 | → ценность | помещать константу #index из пула констант (двойную, длинную или динамически вычисляемую константу) в стек (широкий индекс создается как индексный байт1 << 8 | индексбайт2 ) |
Львов | 6д | 0110 1101 | значение1, значение2 → результат | разделить две длинные позиции | |
загрузить | 16 | 0001 0110 | 1: индекс | → ценность | загрузить длинное значение из локальной переменной #index |
lload_0 | 1е | 0001 1110 | → ценность | загрузить длинное значение из локальной переменной 0 | |
lload_1 | 1ф | 0001 1111 | → ценность | загрузить длинное значение из локальной переменной 1 | |
lload_2 | 20 | 0010 0000 | → ценность | загрузить длинное значение из локальной переменной 2 | |
lload_3 | 21 | 0010 0001 | → ценность | загрузить длинное значение из локальной переменной 3 | |
лмуль | 69 | 0110 1001 | значение1, значение2 → результат | умножить два длинных слова | |
лнег | 75 | 0111 0101 | значение → результат | отрицать длинное | |
переключатель поиска | аб | 1010 1011 | 8+: <заполнение 0–3 байта>, defaultbyte1, defaultbyte2, defaultbyte3, defaultbyte4, npairs1, npairs2, npairs3, npairs4, пары совпадение-смещение... | ключ → | целевой адрес ищется в таблице с использованием ключа, и выполнение продолжается с инструкции по этому адресу |
их | 81 | 1000 0001 | значение1, значение2 → результат | побитовое ИЛИ двух длинных значений | |
Ирем | 71 | 0111 0001 | значение1, значение2 → результат | остаток от деления двух длинных позиций | |
вернуться | объявление | 1010 1101 | значение → [пусто] | вернуть длинное значение | |
лшл | 79 | 0111 1001 | значение1, значение2 → результат | побитовый сдвиг влево от длинного значения1 на целого значения2 позиции | |
лшр | 7б | 0111 1011 | значение1, значение2 → результат | побитовый сдвиг вправо от длинного значения1 на целого значения2 позиции | |
магазин | 37 | 0011 0111 | 1: индекс | значение → | сохранить длинное значение в локальной переменной #index |
lstore_0 | 3ф | 0011 1111 | значение → | сохранить длинное значение в локальной переменной 0 | |
lstore_1 | 40 | 0100 0000 | значение → | сохранить длинное значение в локальной переменной 1 | |
lstore_2 | 41 | 0100 0001 | значение → | сохранить длинное значение в локальной переменной 2 | |
lstore_3 | 42 | 0100 0010 | значение → | сохранить длинное значение в локальной переменной 3 | |
lsub | 65 | 0110 0101 | значение1, значение2 → результат | вычесть две длинные позиции | |
лушр | 7д | 0111 1101 | значение1, значение2 → результат | побитовый сдвиг вправо от длинного значения1 на позиции целого значения2 , без знака | |
lxor | 83 | 1000 0011 | значение1, значение2 → результат | побитовое исключающее ИЛИ двух длинных значений | |
мониторы | с2 | 1100 0010 | ссылка на объект → | войти в монитор объекта («захватить замок» — начало раздела Synchronized()) | |
мониторвыход | с3 | 1100 0011 | ссылка на объект → | выйти из монитора для объекта («снять блокировку» – конец раздела Synchronized()) | |
multianewarray | с5 | 1100 0101 | 3: индексный байт1, индексныйбайт2, размеры | count1, [count2,...] → ссылка на массив | создать новый массив измерений типа, определенного ссылкой на класс в индексе постоянного пула ( индексный байт1 << 8 | индексбайт2 ); размеры каждого измерения идентифицируются count1 , [ count2 и т. д.] |
новый | бб | 1011 1011 | 2: индексный байт1, индексный байт2 | → ссылка на объект | создать новый объект типа, определенного ссылкой на класс в индексе постоянного пула ( индексный байт1 << 8 | индексбайт2 ) |
Ньюрей | до нашей эры | 1011 1100 | 1: тип | счетчик → ссылка на массив | создать новый массив с элементами счетчика примитивного типа, идентифицируемого atype |
нет | 00 | 0000 0000 | [Без изменений] | не выполнять никаких операций | |
поп | 57 | 0101 0111 | значение → | отбросить верхнее значение в стеке | |
поп2 | 58 | 0101 1000 | {значение2, значение1} → | отбросить два верхних значения в стеке (или одно значение, если оно двойное или длинное) | |
путфилд | б5 | 1011 0101 | 2: индексный байт1, индексный байт2 | ссылка на объект, значение → | установить значение поля в объекте objectref , где поле идентифицируется индексом ссылки на поле в пуле констант ( индексный байт1 << 8 | индексбайт2 ) |
путстатический | б3 | 1011 0011 | 2: индексный байт1, индексный байт2 | значение → | установить статическое поле в значение в классе, где поле идентифицируется индексом ссылки на поле в пуле констант ( индексный байт1 << 8 | индексбайт2 ) |
верно † | а9 | 1010 1001 | 1: индекс | [Без изменений] | продолжить выполнение с адреса, взятого из локальной переменной #index (асимметрия с jsr намеренна) |
возвращаться | б1 | 1011 0001 | → [пусто] | вернуть void из метода | |
салоад | 35 | 0011 0101 | ссылка на массив, индекс → значение | загрузить короткое из массива | |
састор | 56 | 0101 0110 | ссылка на массив, индекс, значение → | сохранить короткое значение в массиве | |
выпивать | 11 | 0001 0001 | 2: байт1, байт2 | → ценность | поместить короткое замыкание в стек как целое значение |
менять | 5ф | 0101 1111 | значение2, значение1 → значение1, значение2 | меняет местами два верхних слова в стеке (обратите внимание, что значение1 и значение2 не должно быть двойным или длинным) | |
настольный переключатель | аа | 1010 1010 | 16+: [заполнение 0–3 байта], defaultbyte1, defaultbyte2, defaultbyte3, defaultbyte4, lowbyte1, lowbyte2, lowbyte3, lowbyte4, highbyte1, highbyte2, highbyte3, highbyte4, смещения перехода... | индекс → | продолжить выполнение с адреса в таблице по индексу смещения |
широкий | с4 | 1100 0100 | 3/5: код операции, индексный байт1, индексныйбайт2 или iinc, indexbyte1, indexbyte2, countbyte1, countbyte2 |
[то же, что и соответствующие инструкции] | выполнить код операции , где код операции — это iload, fload, aload, lload, dload, istore, fstore, astore, lstore, dstore или ret, но предположим, что индекс 16-битный; или выполните iinc, где индекс равен 16 битам, а константа, на которую нужно увеличить, представляет собой 16-битное короткое число со знаком. |
(без имени) | CB-FD | эти значения в настоящее время не назначены для кодов операций и зарезервированы для использования в будущем. |
† Устарело в Java 7 (основной класс версии 51). [ 2 ] Они не появятся в файлах классов, созданных более новым компилятором. ret
явно не устарел, но бесполезен без jsr
и jsr_w
коды операций.
См. также
[ редактировать ]- Jazelle DBX (Direct Bytecode eXecution), функция, которая выполняет некоторые байт-коды Java аппаратно на некоторых процессорах ARM9.
- Common Intermediate Language (CIL), аналогичная спецификация байт-кода, работающая в среде CLR .NET Framework.
Ссылки
[ редактировать ]- ^ «Спецификация виртуальной машины Java® – Java SE 12 Edition» . Проверено 22 мая 2021 г.
- ^ «Глава 4. Формат файла класса 4.9.1. Статические ограничения» . Проверено 22 мая 2021 г.