ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.01.2021
Просмотров: 151
Скачиваний: 1
Формат (битов):
2 5 6 5 1 8 5
1а |
0 |
Выходной регистр |
Код операции |
Входной регистр 1 |
0 |
Операция с плавающей точкой |
Входной регистр 2 |
3 регистра |
1b |
0 |
Выходной регистр |
Код операции |
Входной регистр 1 |
1 |
Непосредственная константа |
Непоср. операнд |
2 5 3 22
2 |
0 |
Выходной регистр |
Код опер. |
Непосредственная константа |
SETHI |
2 1 4 3 22
3 |
0 |
A |
Условие |
Код опер. |
Смещение относительно счетчика команд |
BRANCH |
2 30
4 |
0 |
Смещение относительно счетчика команд |
CALL |
5.1.5.4. Форматы команд JVM
Большинство форматов команд машины JVM просты. Это объясняется тем, что JVM разработана сравнительно недавно. Все команды начинаются с кода операции в 1 байт. В некоторых командах за кодом операции следует второй байт (формат 2). Это может быть индекс (как в команде ILOAD), константа (как в команде BIPUSH) или код типа данных (как в команде NEWARRAY, которая создает одномерный массив указанного типа в “куче"). Третий формат отличается от второго тем, что вместо 8-битной константы там содержится 16-битная константа (как, например, у команд WIDE ILOAD или GOTO). Формат 4 используется только для команды IINC. Формат 5 имеет команда MULTINEWARRAY, создающей в “куче” многомерный массив. Формат 6 нужен для команды INVOKEINTERFACE, которая вызывает процедуру при определенных обстоятельствах. Формат 7 предназначен для команды WIDE IINC, чтобы обеспечить 16-битный индекс и 16-битную константу, которая прибавляется к заданной переменной. Формат 8 применяется только для команд WIDE GOTO и WIDE JSR, чтобы осуществлять переходы на большие расстояния в памяти и вызовы определенных процедур. Последний формат используется только двумя командами, которые нужны для реализации оператора языка Java switch. Таким образом, все команды JVM, за исключением восьми особых команд, используют простые и короткие форматы 1, 2 и 3.
Система команд JVM организована таким образом, чтобы большинство наиболее распространенных команд кодировалось в одном байте. Рассмотрим, например, как происходит загрузка локальной переменной в стек. Для этого существуют три способа.
Самый короткий вариант обеспечивает наиболее распространенные случаи, а самый длинный - все возможные. JVM содержит команду ILOAD, использующую 8-битный индекс для определения локальной переменной, которую нужно поместить в стек. Префиксная команда WIDE позволяет использовать следом за собой тот же код операции ILOAD для определения 16-битного смещения (т. е. любого из первых 65 536 элементов) во фрейме локальных переменных. Для команды WIDE ILOAD требуется 4 байта: 1 - для WIDE, 1 - для кода ILOAD и 2 - для 16-битного индекса. Такое разделение объясняется тем, что большинство команд загрузки используют одну из первых 256 локальных переменных. Префикс WIDE нужен для универсальности, применимости к любым ситуациям, но используется редко.
Есть еще более короткий способ. Так как параметры процедуры передаются в первые несколько слов фрейма локальных переменных, команда ILOAD часто использует элементы фрейма локальных переменных с невысокими индексами. Разработчики JVM назначили отдельные 1-байтные коды операций для каждого из наиболее употребимых индексов. Команда ILOAD_0 помещает в стек локальную переменную 0. Эта команда полностью эквивалентна 2-байтной команде ILOAD 0, за исключением того, что занимает один байт вместо двух. Точно так же команды IL0AD_1, IL0AD_2 и IL0AD_3 помещают в стек локальные переменные 1, 2 и 3.
Таким образом, локальную переменную 1, например, можно загрузить одним из трех способов: ILOAD_1, ILOAD 1 и WIDE ILOAD 1.
Многие другие команды также имеют подобные варианты. Заметим, что сокращенные вариант команд приносят и некоторые убытки, т. к. занимают коды из небольшого запаса 256 различных команд, которые могут определяться в одном байте. Префикс WIDE сам использует одно из 256 возможных значений, но он применяется к различным кодам операций.
Для команд загрузки операндов из набора констант вместо использования WIDE представлены две версии команды: LDC и LDC_W.
Биты
0 |
<------ 8 ------> |
<------ 8 ------> |
<------ 8 ------> |
<------ 8 ------> |
<------ 8 ------> |
Формат
1 |
Код операции |
2 |
Код операции |
BYTE |
Байт=Индекс, константа или тип |
3 |
Код операции |
SHORT |
Индекс, конст. или смещение |
4 |
Код операции |
Индекс |
Константа |
5 |
Код операции |
Индекс |
Размерность массива |
6 |
Код операции |
Индекс |
#Параметры |
0 |
7 |
Код операции |
Индекс |
Константа |
8 |
Код операции |
32-битное смещение перехода |
9 |
Код операции |
Длина переменной |