ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.01.2021

Просмотров: 151

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Формат (битов):

2 5 6 5 1 8 5


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

Код операции

Длина переменной