3 Набор инструкций виртуальной машины

3.1 - Формат инструкций

3.2 - Загрузка констант в стек

3.3 - Загрузка локальных переменных в стек

3.4 - Сохранение значений стека в локальных переменных

3.5 - Расширенный индекс для загрузки, сохранения и приращения

3.6 - Управление массивами

3.7 - Инструкции стека

3.8 - Арифметические инструкции

3.9 - Логические инструкции

3.10 - Операции преобразования

3.11 - Инструкции передачи управления

3.12 - Возврат из функции

3.13 - Табличный переход

3.14 - Управление полями объектов

3.15 - Вызов метода

3.16 - Обработка исключений

3.17 - Прочие операции с объектами

3.18 - Мониторы

3.1 Формат инструкций

Инструкции для виртуальной машины языка Ява представлены в этом документе

в следующей форме.

Название инструкции

Короткое описание инструкции

opcode = number

operand1

operand2

...

 

Стек: ..., value1, value2 = > ..., value3

 

Более подробное описание, объясняющее функции инструкции и указывающее все исключения, которые могли бы быть сгенерированы при выполнении.

Каждая строка в синтаксической диаграмме представляет собой 8-битный байт, определяемый единственным образом.

В виртуальной машине языка Ява операции производятся над элементами стека и результаты помещаются обратно в стек. Обычно не оговаривают является ли стек источником или приемником операндов, но при необходимости это будет уточняться.

Например, инструкция iload имеет короткое описание "Загрузка целого значения

из локальной переменной." .Подразумевается, что оно загружается в стек. Инструкция iadd обозначает "Сложение целых"; в данном случае стек является источником и

приемником.

Считается, что инструкции, которые не влияют на поток управления всегда продвигают PC виртуальной машины на код операции следующей инструкции. Только для инструкций, которые влияют на поток управления будет явно указываться как они влияют на PC-счетчик.

3.2 Загрузка констант в стек

bipush

Загрузка в стек однобайтового целого со знаком

bipush = 16

byte1

Стек: ... = > ..., value

 

byte1 интерпретируется как 8-битное value со знаком. Это value расширяется до

целого и помещается в стек операндов.

sipush

Загрузка в стек двухбайтового целого со знаком

sipush = 17

byte1

byte2

Стек: ... = > ...,item

byte1 и byte2 рассматриваются как 16-битное value со знаком. Это value расширяется до целого и помещается в стек операндов.

ldc1

Загрузка в стек элемента из константного пула

ldc1 = 18

indexbyte1

Стек: ... = > ..., item

 

indexbyte1 используется как беззнаковый 8-битный индекс в константном пуле текущего класса. item, ñîîòâåòñòâóþùèé ýòîìó èíäåêñó помещается на стек. Если загружается строка (объект класса String) и не имеется достаточно памяти для ее размещения, то генерируется OutOfMemoryError.

Заметьте: результатом загрузки в стек строки является ссылка на объект; что происходит с другими константами объясните где-нибудь здесь.

ldc2

Загрузка в стек элемента из константного пула

ldc2 = 19

indexbyte1

indexbyte2

Стек: ... = > ..., item

 

indexbyte1 и indexbyte2 рассматриваются как 16-битный индекс без знака в константном пуле текущего класса. item, соответствующий индексу помещается на стек. Если при загрузке строки не оказывается достаточно памяти для ее размещения, то генерируется OutOfMemoryError.

Заметьте: результатом загрузки в стек строки является ссылка на объект; что происходит с другими константами объясните где-нибудь здесь.

ldc2w

Загрузка в стек длинного целого или двойного вещественного значения из константного пула

ldc2w = 20

indexbyte1

indexbyte2

Стек: ... = > ..., constant-word1, constant-word2

 

indexbyte1 и indexbyte2 рассматриваются как беззнаковый 16-битный индекс

в константном пуле текущего класса. Кончтанта из двух слов, состоящая из двух constant-word соответствующая индексу, помещается на стек.

aconst_null

Загрузка в стек null ( пустой ссылки на объект)

aconst_null = 1

Стек: ... = > ..., null

 

Загружает в стек null ( пустую ссылку на объект) .

iconst_m1

Загрузка целочисленной константы -1

iconst_m1 = 2

Стек: ... = > ..., -1

 

Загружает целочисленную константу -1 в стек.

iconst_<n>

Загрузка целочисленной константы

iconst_<n>

Стек: ... = > ..., <n>

 

Формы: iconst_0 = 3, iconst_1 = 4, iconst_2 = 5, iconst_3 = 6, iconst_4 =

7, iconst_5 = 8

Загружает целочисленную константу <n> в стек.

lconst_< l >

Загрузка длинной целочисленной константы

lconst_< l >

Стек: ... = > ..., < l > -word1, < l > -word2

 

Формы: lconst_0 = 9, lconst_1 = 10

Загружает длинную целочисленную константу < l > в стек.

fconst_<f>

Загрузка вещественного числа одинарной точности

fconst_<f>

Стек: ... = > ..., <f>

Формы: fconst_0 = 11, fconst_1 = 12, fconst_2 = 13

Загружает число с плавающей точкой одинарной точности равное <f> в стек.

dconst_<d>

Загрузка вещественного числа двойной точности

dconst_<d>

Стек: ... = > ..., <d> -word1, <d> -word2

 

Формы: dconst_0 = 14, dconst_1 = 15

Загружает число с плавающей точкой двойной точности равное <d> в стек.

3.3 Загрузка локальных переменных в стек

iload

Загрузка целого из локальной переменной

iload = 21

vindex

Стек: ... = > ..., value

 

Значение локальной переменной с номером vindex в текущем окружении помещается в стек операндов.

iload_<n>

Загрузка целого из локальной переменной

iload_<n>

Стек: ... = > ..., value

 

Формы: iload_0 = 26, iload_1 = 27, iload_2 = 28, iload_3 = 29

Значение локальной переменной с номером <n> в текущем окружении помещается в стек операндов.

Эта инструкция - то же самое, что и iload с vindex <n>, за исключением того, что

операнд <n> является неявным.

lload

Загрузка длинного целого из локальной переменной

lload = 22

vindex

Стек: ... = > ..., value-word1, value-word2

 

Значение локальных переменных с номером vindex и vindex + 1 в текущем окружении

помещается в стек операндов.

lload_<n>

Загрузка длинного целого из локальной переменной

lload_<n>

Стек: ... = > ..., value-word1, value-word2

 

Формы: lload_0 = 30, lload_1 = 31, lload_2 = 32, lload_3 = 33

Значение локальных переменных с номером <n> и <n> + 1 в текущем окружении помещается в стек операндов.

Эта инструкция - то же самое, что и lload с vindex <n>, за исключением того, что операнд <n> является неявным.

fload

Загрузка вещественного одинарной точности из локальной переменной.

fload = 23

vindex

Стек: ... = > ..., value

 

Значение локальной переменной value соответствующей vindex в текущем окружении помещается в стек операндов.

fload_<n>

Загрузка вещественного одинарной точности из локальной переменной.

fload_<n>

Стек: ... = > ..., value

 

Формы: fload_0 = 34, fload_1 = 35, fload_2 = 36, fload_3 = 37

Значение локальной переменной value с номером <n> в текущем окружении помещается в стек операндов.

Эта инструкция - то же самое, что и fload с vindex <n>, за исключением того, что операнд <n> является неявным.

dload

Загрузка вещественного двойной точности из локальной переменной.

dload = 24

vindex

Стек: ... = > ..., value-word1, value-word2

 

Значение локальных переменных с номерами vindex и vindex + 1 в текущем окружении

помещается в стек операндов.

dload_<n>

Загрузка вещественного двойной точности из локальной переменной.

dload_<n>

Стек: ... = > ..., value-word1, value-word2

 

Формы: dload_0 = 38, dload_1 = 39, dload_2 = 40, dload_3 = 41

Значение локальных переменных с номерами <n> и <n> + 1 в текущем окружении помещается в стек операндов.

Эта инструкция - то же самое, что и dload с vindex <n>, за исключением того, что операнд

является неявным.

аload

Загрузка объектной ссылки из локальной переменной

aload = 25

vindex

Стек: ... = > ..., value

 

Значение локальной переменной с номером vindex в текущем окружении помещается в стек операндов.

aload_<n>

Загрузка объектной ссылки из локальной переменной

aload_<n>

Стек: ... = > ..., value

 

Формы: aload_0 = 42, aload_1 = 43, aload_2 = 44, aload_3 = 45

Значение value локальной переменной с номером <n> в текущем окружении помещается в стек операндов.

Эта инструкция - тот же самое, что и aload с vindex <n>, за исключением того, что

операнд <n> является неявным.

3.4 Сохранение значений стека в локальных переменных

istore

Сохранение целого значения в локальной переменной

istore = 54

vindex

Стек: ..., value = > ...

 

value должно быть целым. Локальная переменная vindex в текущем окружении приобретает это значение.

istore_<n>

Сохранение целого в локальной переменной

istore_<n>

Стек: ..., value = > ...

 

Формы: istore_0 = 59, istore_1 = 60, istore_2 = 61, istore_3 = 62

value должно быть целым. Локальная переменная <n> в текущем окружении

приобретает это значение.

Эта инструкция - то же самое, что и istore с vindex <n>, за исключением того, что операнд <n> является неявным.

lstore

Сохранение длинного целого в локальной переменной

lstore = 55

vindex

Стек: ..., value-word1, value-word2 = > ...

 

value должно быть длинным целым. Локальные переменные vindex и vindex + 1 в

текущем окружении приобретают эти значения.

lstore_<n>

Сохранение длинного целого в локальной переменной

istore_<n>

Стек: ..., value-word1, value-word2 = > ...

 

Формы: lstore_0 = 63, lstore_1 = 64, lstore_2 = 65, lstore_3 = 66

value должно быть длинным целым. Локальные переменные <n> и <n> + 1 в текущем

окружении приобретют эти значения.

Эта инструкция - то же самое, что и lstore с vindex <n>, за исключением того, что операнд <n> является неявным.

fstore

Сохранение вещественного одинарной точности в локальной переменной

fstore = 56

vindex

Стек: ..., value = > ...

 

value должно быть числом с плавающей точкой одинарной точности. Локальная переменная vindex в текущем окружении приобретает это значение.

fstore_<n>

Сохранение вещественного одинарной точности в локальной переменной

fstore_<n>

Стек: ..., value = > ...

 

Формы: fstore_0 = 67, fstore_1 = 68, fstore_2 = 69, fstore_3 = 70

value должно быть числом с плавающей точкой одинарной точности. Локальная переменная <n> в текущем окружении приобретает это значение.

Эта инструкция - то же самое, что и fstore с vindex <n>, за исключением того, что операнд <n> является неявным.

dstore

Сохранение двойного вещественного в локальной переменной

 

dstore = 57

vindex

Стек: ..., value-word1, value-word2 = > ...

 

value должно быть числом с плавающей точкой двойной точности. Локальные переменные vindex и vindex + 1 в текущем окружении приобретают эти значения.

dstore_<n>

Сохранение двойного вещественного в локальной переменной

dstore_<n>

Стек: ..., value-word1, value-word2 = > ...

 

Формы: dstore_0 = 71, dstore_1 = 72, dstore_2 = 73, dstore_3 = 74

value должно быть числом с плавающей точкой двойной точности . Локальные переменные <n> и <n> + 1 в текущем окружении приобретают эти значения.

Эта инструкция - то же самое, что и dstore с vindex <n>, за исключением того, что операнд <n> является неявным.

astore

Сохранение объектной ссылки в локальной переменной

astore = 58

vindex

Стек: ..., value = > ...

value должнo быть адресом возврата или ссылкой на объект. Локальная переменная

vindex в текущем окружении приобретает это значение.

astore_<n>

Сохранение объектной ссылки в локальной переменной

astore_<n>

Стек: ..., value = > ...

 

Формы: astore_0 = 75, astore_1 = 76, astore_2 = 77, astore_3 = 78

value должно быть адресом возврата или ссылкой на объект. Локальная переменная

<n> в текущем окружении приобретает это значение.

Эта инструкция - то же самое, что и astore с vindex <n>, за исключением того, что операнд <n> является неявным.

iinc

Увеличение локальной переменной на константу

iinc = 132

vindex

const

Стек: без изменений

Локальная переменная vindex в текущем окружении должна содержать целое значение.

Ее значение увеличивается на значение const, где const интерпретируется как

8-битная величина со знаком.

3.5 Расширенный индекс для загрузки, сохранения и приращения

wide

Расширенный индекс для доступа к локальным переменным для команд загрузки, сохранения и приращения .

wide = 196

vindex2

Стек: без изменений

Этот байткод должен предшествовать одному из следующего байткодов: iload, lload, fload, dload, aload, istore, lstore, fstore, dstore, astore, iinc. vindex следующего байткода и vindex2 этого байткода компонуются в беззнаковый 16-битный индекс локальной переменной в текущем окружении. Следующий байткод исполняется как обычно за исключением того, что использует расширенный индекс.

3.6 Управление массивами

newarray

Размещение нового массива

newarray = 188

atype

Стек: ..., size = > rezult

 

size должен быть целым. Он представляет собой число элементов в новом массиве. atype - внутренний код, который указывает тип объявляемого массива.

Возможные варианты значений atype :

T_BOOLEAN

4

T_CHAR

5

T_FLOAT

6

T_DOUBLE

7

T_BYTE

8

T_SHORT

9

T_INT

10

T_LONG

11

Размещает новый массив типа atype, способный содержать size элементов, результатом является ссылка на этот новый объект. Можно размещать массив достаточно большой, чтобы содержать size элементов типа atype. Все элементы массива обнуляются.

Если size меньше нуля, то генерируется NegativeArraySizeException. Если памяти недостаточно для размещения массива, то генерируется OutOfMemoryError.

anewarray

Объявление нового массива из ссылок на объекты

anewarray = 189

indexbyte1

indexbyte2

Стек: ..., size= > result

 

size должен быть целымr. Его значение представляет собой число элементов в новом

массиве.

indexbyte1 и indexbyte2 используются для формирования индекса в константном пуле текущего класса. Элемент с этим индексом должен быть классом.

Размещает новый массив обозначенного типа класса, способный содержать size элементов, результатом является ссылка на этот новый объект. Можно размещать массив достаточно большой, чтобы содержать size элементов данного типа класса. Все элементы массива инициализируются пустым указателем(null).

Если размер меньше нуля, то генерируется NegativeArraySizeException. Если недостаточно памяти для объявления массива, то генерируется OutOfMemoryError .

anewarray используется для создания одномерного массива из ссылок на объекты Например, чтобы создать

new Thread[7]

используется следующий код:

bipush 7

anewarray < Класс "java.lang.Thread" >

anewarray может также использоваться для создания первого измерения многомерного массива. Например, следующее объявление массива:

new int[6][]

создается следующим кодом:

bipush 6

anewarray < Класс " [I " >

См. CONSTANT_Class в главе " Class File Format ", содержащая информацию о

названиях классов массивов.

multianewarray

Размещение нового многомерного массива

multianewarray = 197

indexbyte1

indexbyte2

dimensions

Стек: ..., size1 size2 ... sizen = > result

 

Каждый size должен быть типа integer. Каждый из них представляет собой число элементов в измерении массива.

indexbyte1 и indexbyte2 используются для создания индекса в константном пуле текущего класса. Элемент с этим индексом должен быть классом массива единичной или большей размерности.

Необходимо учитывать следующее относительно размерности:

new int[6][3][]

используется следующий код:

bipush 6

bipush 3

multianewarray < Класс " [[[I " > 2

Если любой из size аргументов на стеке меньше нуля, то генерируется NegativeArraySizeException. Если не имеется достаточно памяти для размещения массива, то генерируется OutOfMemoryError.

Результатом является ссылка на новый объект массива.

Заметьте: Необходимо больше объяснений о том что такое массив массивов.

Заметьте: При создании одномерного массива эффективнее использовать newarray или anewarray.

См. CONSTANT_Class в главе " Class File Format " ,содержащая информацию о

названиях классов массивов.

arraylength

Возвращает длину массива

arraylength = 190

Стек: ..., objectref = > ..., length

 

objectref должен быть ссылкой на объект-массив. Длина массива определяется и замещает objectref на вершине стека.

Если objectref пустой(null), то генерируется NullPointerException.

iaload

Загрузка целого из массива

iaload = 46

Стек: ..., arrayref, index = > ..., value

 

arrayref должен быть ссылкой на массив из целочисленных элементов. Индекс должен быть целым. Целочисленное value соответствующее индексу в массиве извлекается и помещается на вершину стека.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

laload

Загрузка длинного целого из массива

laload = 47

Стек: ..., arrayref, index = > ..., value-word1, value-word2

 

arrayref должен быть ссылкой на массив из элементов типа длинное целое. index должен быть целым. value длинного целого типа соответствующее индексу в массиве извлекается и помещается на вершину стека.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

faload

Загрузка вещественного из массива

faload = 48

Стек: ..., arrayref, index = > ..., value

 

arrayref должен быть ссылкой на массив из вещественных одинарной точности. Индекс должен быть целым. Вещественное одинарной точности value соответствующее индексу в массиве извлекается и помещается на вершину стека.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

daload

Загрузка двойного вещественного из массива

daload = 49

Стек: ..., arrayref, index = > ..., value-word1, value-word2

arrayref должен быть ссылкой на массив из элементов вещественного типа двойной точности.Индекс должен быть целым. Вещественное двойной точности value cоответствующее индексу в массиве извлекается и помещается на вершину стека.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

aaload

Загрузка объектной ссылки из массива

aaload = 50

Стек: ..., arrayref, index = > ..., value

 

arrayref должен быть ссылкой на массив из объектных ссылок. Индекс

должен быть целым. Объектная ссылка соответствующая индексу в массиве извлекается и помещается на вершину стека.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

baload

Загрузка байта со знаком из массива.

baload = 51

Стек: ..., arrayref, index = > ..., value

 

arrayref должен быть ссылкой на массив из байтовых со знаком. Индекс

должен быть целым. Байтовый со знаком соответствующий индексу в массиве извлекается, расширяется до целого, и помещается на вершину стека.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

caload

Загрузка символа из массива

caload = 52

Стек: ..., arrayref, index = > ..., value

 

arrayref должен быть ссылкой на массив из символов. Индекс

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

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

saload

Загрузка короткого из массива

saload = 53

Стек: ..., arrayref, index = > ..., value

 

arrayref должен быть ссылкой на массив из коротких целых. Индекс должен быть целым. Короткий целый соответствующий индексу в массиве извлекается, расширяется до целого, и помещается на вершину стека.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

iastore

Сохранение в целочисленном массиве

iastore = 79

Стек: ..., arrayref, index, value = > ...

 

arrayref должен быть ссылкой на массив из целых, index и value должны быть

целыми. Целое value сохраняется в массиве в элементе с номером index.

Если arrayref равенnull, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

lastore

Сохранение в массиве из длинных целых

lastore = 80

Стек: ..., arrayref, index, value-word1, value-word2 = > ...

 

arrayref должен быть ссылкой на массив из длинных целых, индекс должен быть

целым, а value длинным целым. value типа длинного целого сохраняется в массиве в элементе с номером index.

Если arrayref равен null,то генерируется NullPointerException. Если индекс не входит в пределы границ массива,то генерируется ArrayIndexOutOfBoundsException.

fastore

Сохранение в массиве из одинарных вещественных

fastore = 81

Стек: ..., arrayref, index, value = > ...

 

arrayref должен быть массивом из чисел одинарной точности с плавающей точкой index должен быть целым, а value - числом одинарной точности с плавающей точкой. Одинарное вещественное value сохраняется в массиве в элементе с номером index.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

dastore

Сохранение в массиве из двойных вещественных

dastore = 82

Стек: ..., arrayref, index, value-word1, value-word2 = > ...

 

arrayref должен быть массивом из чисел двойной точности с плавающей точкой. index должен быть целым, а value - числом двойной точности с плавающей точкой. Двойное вещественное value сохраняется в массиве в элементе с номером index.

Если arrayref равен null,то генерируется NullPointerException. Если индекс не входит в пределы границ массива,то генерируется ArrayIndexOutOfBoundsException.

aastore

Сохранение в массиве из объектных ссылок

aastore = 83

Стек: ..., arrayref, index, value = > ...

 

arrayref должен быть ссылкой на массив из объектных ссылок, index должен быть целым, а value - объектной ссылкой. Объектная ссылка value сохраняется в массиве в элементе с номером index.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

Фактический тип value должен быть согласован с фактическим типом элементов массива. Например, можно хранить пример класса Thread в массиве класса Object, но не наоборот. (См. Java Language Specification для получения информации о том, как определять, является ли объектная ссылка примером такого класса.) Если сделана попытка сохранения несовместимой ссылки на объект, то генерируется ArrayStoreException.

Заметьте: Не надо ссылаться на спецификацию языка Ява; укажите семантику здесь.

bastore

Сохранение в массиве байтов со знаком

bastore = 84

Стек: ..., arrayref, index, value = > ...

 

arrayref должен быть ссылкой на массив из байтов со знаком, index и value должны быть целыми. Целое value сохраняется в массиве в элементе с номером index. Если value слишком длинное для того, чтобы быть байтом со знаком, то оно отсекается.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива,то генерируется ArrayIndexOutOfBoundsException.

castore

Сохранение в символьном массиве

castore = 85

Стек: ..., arrayref, index, value = > ...

 

arrayref должен быть массивом из символов, index и value должны быть целыми. Целое value сохраняется в массиве в элементе с номером index. Если value слишком длинное для того, чтобы быть символом, то оно отсекается.

Если arrayref равен null, то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

sastore

Сохранение в массиве из коротких целых

sastore = 86

Стек: ..., array, index, value = > ...

arrayref должен быть массивом из коротких, индекс должен быть целым Целое value сохраняется в массиве в элементе с номером index. Если value слишком длинное для того, чтобы быть коротким целым, то оно отсекается.

Если arrayref равен null,то генерируется NullPointerException. Если индекс не входит в пределы границ массива, то генерируется ArrayIndexOutOfBoundsException.

3.7 Инструкции стека

nop

Ничего не делает

nop = 0

Стек: без изменений

 

Ничего не делает.

pop

Извлечение слова с вершины стека

pop = 87

Стек: ..., any = > ...

 

Извлекает слово с вершины стека.

pop2

Извлечение двух слов с вершины стека

pop2 = 88

Стек: ..., any2, any1 = > ...

 

Извлекает два слова с вершины стека.

dup

Дублирование слова на вершине стека

dup = 89

Стек: ..., any = > ..., any, any

 

Дублирует слово на вершине стека

dup2

Дублирование двух слов на вершине стека

dup2 = 92

Стек: ..., any2, any1 = > ..., any2, any1, any2, any1

 

Дублирует пару слов на вершине стека

dup_x1

Дублирование слово на вершине стека и помещение копии в стек на два слова ниже

dup_x1 = 90

Стек: ..., any2, any1 = > ..., any1, any2, any1

 

Дублирует слово на вершине стека и помещает копию в стек на два слова ниже

dup2_x1

Дублирование двух слов на вершине стека и помещение копий на два слова ниже

dup2_x1 = 93

Стек: ..., any3, any2, any1 = > ..., any2, any1, any3, any2, any1

 

Дублирует два слова на вершине стека и помещает копии в стеке на два слова ниже

dup_x2

Дублирование вершины стека и помещение копии на три слова ниже

dup_x2 = 91

Стек: ..., any3, any2, any1 = > ..., any1, any3, any2, any1

 

Дублирует вершину стека и помещает ее копию в стек на два слова ниже.

dup2_x2

Дублирование двух слов на вершине стека и помещение копий на три слова ниже

dup2_x2 = 94

Стек: ..., any4, any3, any2, any1 = > ..., any2, any1, any4, any3, any2, any1

 

Дублирует два слова на вершине стека и помещает копии в стек на три слова ниже.

swap

Обмен двух слов на вершине стека

swap = 95

Стек: ..., any2, any1 = > ..., any2, any1

 

Меняет местами два элемента на вершине стека.

3.8 Арифметические инструкции

iadd

Сложение целых

iadd = 96

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть целыми числами. Значения суммируются и заменяются в стеке их суммой, которая является целым числом.

ladd

Сложение длинных целых

ladd = 97

Стек : ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 должны быть длинными целыми числами. Значения суммируются и заменяются в стеке их суммой, которая является длинным целым числом.

fadd

Сложение одинарных вещественных

fadd = 98

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть вещественными числами одинарной точности. Значения суммируются и заменяются в стеке их суммой, которая вещественным числом одинарной точности.

dadd

Сложение двойных вещественных

dadd = 99

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 должны быть вещественными числами двойной точности. Значения суммируются и заменяются в стеке их суммой, которая является вещественным числом двойной точности.

lsub

Вычитание целых

isub = 100

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть целыми числами. value2 вычитается из value1, и оба значения заменяются в стеке их разностью, которая является целым числом.

lsub

Вычитание длинных целых

lsub = 101

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 должны быть длинными целыми числами. value2 вычитается из value1, и оба значения заменяются в стеке их разностью, которая является длинным целым числом.

fsub

Вычитание одинарных вещественных

fsub = 102

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть вещественными числами одинарной точности. value2 вычитается из value1, и оба значения заменяются в стеке их разностью, которая является вещественным числом одинарной точности.

dsub

Вычитание двойных вещественных

dsub = 103

Стек : ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 должны быть вещественными числами двойной точности. value2 ычитается из value1, и оба значения заменяются в стеке их разностью, которая является вещественным числом двойной точности.

imul

Умножение целых

imul = 104

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть целыми числами. Оба значения заменяются в стеке их произведением, которое является целым числом.

lmul

Умножение длинных целых

lmul = 105

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 должны быть длинными целыми числами. Оба значения заменяются в стеке

их произведением, которое является длинным целым числом.

fmul

Умножение одинарных вещественных

fmul = 106

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть вещественными числами одинарной точности. Оба значения заменяются в стеке их произведением, которое является вещественным числом одинарной точности.

dmul

Умножение двойных вещественных

dmul = 107

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 должны быть вещественными числами двойной точности. Оба значения заменяются в стеке их произведением, которое является вещественным числом двойной точности.

idiv

Деление целых

idiv = 108

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть целыми числами. value1 делится на value2, и оба значения заменяются в стеке их частным, которое является целым числом.

result усекается до ближайшего целого числа, лежащего между ним и 0. При попытке деления на нуль генерируется " / на нуль " ArithmeticException.

ldiv

Деление длинных целых

ldiv = 109

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 должны быть длинными целыми числами. value1 делится на value2, и оба

значения заменяются в стеке их частным, которое является длинным целым числом.

result усекается до ближайшего целого числа, лежащего между ним и 0. При попытке деления на нуль генерируется " / на нуль " ArithmeticException.

fdiv

Деление одинарных вещественных

fdiv = 110

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть вещественными числами одинарной точности. value1 делится на value2, и оба значения заменяются в стеке их частным, которое является вещественным числом одинарной точности.

После деления на нуль частное становится равным NaN.

ddiv

Деление двойных вещественных

ddiv = 111

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 должны быть вещественными числами двойной точности. value1 делится на value2, и оба значения заменяются в стеке их частным, которое является вещественным числом двойной точности.

После деления на нуль частное становится равным NaN.

irem

Остаток от деления целых

irem = 112

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 оба должны быть целыми числами. value1 делится на value2, и оба значения заменяются в стеке их остатком от деления, который является целым числом. При попытке деления на нуль генерируется " / на нуль " ArithmeticException.

Обратите внимание: необходимо описание семантики остатка от делния целых чисел

lrem

Остаток от деления длинных целых

lrem = 113

Стек : ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 оба должны быть длинными целыми числами. value1 делится на value2, и оба значения заменяются в стеке их остатком от деления, который является длинным целым числом. При попытке деления на нуль генерируется " / на нуль " ArithmeticException.

Заметьте: необходимо описание семантики остатка от деления целых чисел

frem

Остаток от деления одинарных вещественных

frem = 114

Стек : ..., value1, value2 = > ..., result

 

value1 и value2 оба должны быть вещественными числами одинарной точности. value1 делится на value2, частное усекается до целого, а затем умножается на value2. Полученное произведение вычитается из value1. result, который является вещественным числом одинарной точности, заменяет оба значения в стеке. result = value1 - (integral_part (value1/value2) * value2), где integral_part () округляется до ближайшего целого числа.

После деления на нуль частное становится равным NaN.

 

Заметьте: gls, для лучшего определения семантики остатка от деления вещественных чисел

drem

Остаток от деления двойных вещественных

drem = 115

Стек : ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 оба должны быть вещественными числами двойной точности. value1 делится на value2, частное усекается до целого, а затем умножается на value2. Полученное произведение вычитается из value1. result, который является вещественным числом двойной точности, заменяет оба значения в стеке. result = value1 - (integral_part (value1/value2) * value2), где integral_part () округляется до ближайшего целого числа.

После деления на нуль частное становится равным NaN.

Заметьте: gls, для лучшего определения семантики остатка при делении вещественных чисел

ineg

Отрицание целого

ineg = 116

Стек : ..., value = > ..., result

 

value должно быть целым числом. Оно заменяется в стеке арифметическим отрицанием.

lneg

Отрицание длинного целого

leg = 117

Стек : ..., value-word1, value-word2 = > ..., result-word1, result-word2

 

value должно быть длинным целым числом. Оно заменяется в стеке арифметическим отрицанием.

fneg

Отрицание одинарного вещественного

fneg = 118

Стек : ..., value = > ..., result

 

value должно быть вещественным числом одинарной точности. Оно заменяется в стеке арифметическим отрицанием.

dneg

Отрицание двойного вещественного числа

dneg = 119

Стек: ..., value-word1, value-word2 = > ..., result-word1, result-word2

value должно быть вещественным числом двойной точности. Оно заменяется в стеке арифметическим отрицанием.

3.9 Логические инструкции

ishl

Сдвиг целого влево

ishl = 120

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть целыми. value1 смещается влево на число, указанное в пяти младших битах value2. Целочисленный result заменяет оба значения в стеке.

ishr

Арифметический сдвиг целого вправо

ishr = 122

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть целыми. value1 сдвигается вправо арифметически

( с расширением знака ) на число, указанное в пяти младших битах value2. Целочисленный результат заменяет оба значения в стеке.

iushr

Логический сдвиг целого вправо

iushr = 124

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть целыми. value1 сдвигается вправо логически ( без расширения знака ) на число, указанное в пяти младших битах value2. Целочисленный результат заменяет оба значения в стеке.

lshl

Сдвиг длинного целого влево

lshl = 121

Стек: ..., value1-word1, value1-word2, value2 = > ..., result-word1, result-word2

 

value1 должен быть длинным целым, value2 должен быть целым. value1 сдвигается влево на число, указанное в шести младших битах value2. Результат, который является длинным целым заменяет оба значения в стеке.

lshr

Арифметический сдвиг длинного целого вправо

lshr = 123

Стек: ..., value1-word1, value1-word2, value2 = > ..., result-word1, result-word2

 

value1 должен быть длинным целым, value2 должен быть целым. value1 сдвигается вправо арифметически ( с расширением знака ) на число, указанное в шести младших битах value2. Результат, который является длинным целым заменяет оба значения в стеке.

lushr

Логический сдвиг длинного целого вправо

lushr = 125

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 должен быть длинным целым, value2 должен быть целым. value1 сдвигается вправо логически ( без расширения знака ) на число, указанное в шести младших битах value2. Результат, который является длинным целым заменяет оба значения в стеке.

iand

Логическое И с операндами целого типа

iand = 126

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 оба должны быть целыми. Они заменяются в стеке их логическим И (конъюнкцией).

land

Логическое И с операндами длинного целого типа

land = 127

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 оба должны быть длинными целыми. Они заменяются в стеке их логическим И (конъюнкцией).

ior

Логическое ИЛИ с целочисленными операндами

ior = 128

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 оба должны быть целыми. Они заменяются в стеке их логическим ИЛИ (дизъюнкцией).

lor

Логическое ИЛИ с операндами длинного целого типа

lor = 129

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

 

value1 и value2 оба должны быть длинными целыми. Они заменяются в стеке их логическим ИЛИ (дизъюнкцией).

ixor

Исключающее ИЛИ с целочисленными операндами

ixor = 130

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 оба должны быть целыми. Они заменяются в стеке их исключающим ИЛИ (исключающей дизъюнкцией).

lxor

Исключающее ИЛИ с операндами длинного целого типа

lxor = 131

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word2 = > ..., result-word1, result-word2

value1 и value2 оба должны быть длинными целыми. Они заменяются в стеке их исключающим ИЛИ (исключающей дизъюнкцией).

3.10 Операции преобразования.

i2l

Преобразование целого в длинное целое

i2l = 133

Стек: ..., value = > ..., result-word1, result-word2

 

value должно быть целым. Оно преобразуется в длинное целое. result

заменяет value на стеке.

i2f

Целое в вещественное

i2f = 134

Стек: ..., value= > ..., result

 

value должно быть целым. Оно преобразуется в число с плавающей точкой одинарной точности. result заменяет value на стеке.

i2d

Целое в двойное вещественное

i2d = 135

Стек: ..., value = > ..., result-word1, result-word2

 

value должно быть целым. Оно преобразуется в число с плавающей точкой двойной точности. result заменяет value на стеке.

l2i

Длинное целое в целое

l2i = 136

Стек: ..., value-word1, value-word2 = > ..., result

 

value должно быть длинным целым. Оно преобразуется в целое, образованное из

32 младших бит. result заменяет value на стеке.

l2f

Длинное целое в вещественное

l2f = 137

Стек: ..., value-word1, value-word2 = > ..., result

 

value должно быть длинным целым. Оно преобразуется в число с плавающей точкой одинарной точности. result заменяет value на стеке.

l2d

Длинное целое в двойное вещественное

l2d = 138

Стек: ..., value-word1, value-word2 = > ..., result-word1, result-word2

 

value должно быть длинным целым. Оно преобразуется в число с плавающей точкой двойной точности. result заменяет value на стеке.

f2i

Вещественное в целое

f2i = 139

Стек: ..., value = > ..., result

 

value должно быть числом с плавающей точкой одинарной точности. Оно преобразуется в целое. result заменяет value на стеке. Смотрите The Java Language Specification для изучения подробностей при преобразовании чисел с плавающей точкой одинарной точности в целые.

Заметьте: Не надо ссылаться на спецификацию языка Ява; дайте семантику здесь.

f2l

Вещественное в длинное целое

f2l = 140

Стек: ..., value = > ..., result-word1, result-word2

 

value должно быть числом с плавающей точкой одинарной точности. Оно преобразуется в длинное целое. result заменяет value на стеке. Смотрите The Java Language Specification для изучения подробностей при преобразовании чисел с плавающей точкой одинарной точности в длинные целые.

Заметьте: Не надо ссылаться на спецификацию языка Ява; дайте семантику здесь.

f2d

Вещественное в двойное вещественное

f2d = 141

Стек: ..., value = > ..., result-word1, result-word2

 

value должно быть числом с плавающей точкой одинарной точности. Оно преобразуется в число с плавающей точкой двойной точности. result заменяет value на стеке.

d2i

Двойное вещественное в целое

d2i = 142

Стек: ..., value-word1, value-word2 = > ..., result

 

value должно быть числом с плавающей точкой двойной точности. Оно преобразуется в целое. result заменяет value на стеке. Смотрите The Java Language Specification для изучения подробностей при преобразовании чисел с плавающей точкой двойной точности в целые.

Заметьте: Не надо ссылаться на спецификацию языка Ява; дайте семантику здесь.

d2l

Двойное вещественное в длинное целое

d2l = 143

Стек: ..., value-word1, value-word2 = > ..., result-word1, result-word2

 

value должно быть числом с плавающей точкой двойной точности. Оно преобразуется в длинное целое. result заменяет value на стеке. Смотрите The Java Language Specification языка Ява для изучения подробностей при преобразовании чисел с плавающей точкой двойной точности в длинные целые.

Заметьте: Не надо ссылаться на спецификацию языка Ява; дайте семантику здесь.

d2f

Двойное вещественное в вещественное

d2f = 144

Стек: ..., value-word1, value-word2 = > ..., result

 

value должно быть числом с плавающей точкой двойной точности. Оно преобразуется в число с плавающей точкой одинарной точности. Если происходит переполнение, result должен быть бесконечностью с тем же знаком как и value. result заменяет value на стек.

int2byte

Целое в знаковый байт

int2byte = 145

Стек: ..., value = > ..., result

 

value должно быть integer. Оно отсекается до 8-битного результата со знаком, затем знак распространяется до целого. result заменяет value на стеке.

int2char

Целое в символ

int2char = 146

Стек: ..., value = > ..., result

value должно быть целым. Оно отсекается до 16-битного результата без знака, затем ноль распространяется до целого. result заменяет value на стеке.

int2short

Целое в короткое

int2short = 147

Стек: ..., value = > ..., result

 

value должно быть целым. Оно отсекается до 16-битного результата , затем знак 0распространяется до целого. result заменяет value на стеке.

3.11 Инструкции передачи управления

ifeq

Переход, если равно 0

ifeq = 153

branchbyte1

branchbyte2

Стек: ..., value = > ...

 

value должно быть целым. Оно удаляется со стека. Если value - ноль, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за ifeq.

ifnull

Переход, если пустой указатель

ifnull = 198

branchbyte1

branchbyte2

Стек: ..., value = > ...

 

value должно быть ссылкой на объект. Оно удаляется со стека. Если value пусто, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за ifnull.

iflt

Переход, если меньше 0

iflt = 155

branchbyte1

branchbyte2

Стек: ..., value = > ...

 

value должно быть целым. Оно удаляется со стека. Если value меньше нуля, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за iflt.

ifle

Переход, если меньше или равно 0

ifle = 158

branchbyte1

branchbyte2

Стек: ..., value = > ...

 

value должно быть целым. Оно удаляется со стека. Если value меньше

или равно 0, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за ifle.

ifne

Переход, если не равно 0

ifne = 154

branchbyte1

branchbyte2

Стек: ..., value = > ...

 

value должно быть целым. Оно удаляется со стека. Если value не равно 0, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за ifne.

ifnonnull

Переход, если не пустой указатель

ifnonnull = 199

branchbyte1

branchbyte2

Стек: ..., value = > ...

 

value должно быть ссылкой на объект.Оно удаляется со стека. Если value - не пустой указатель, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за ifnonull.

ifgt

Переход, если больше 0

ifgt = 157

branchbyte1

branchbyte2

Стек: ..., value = > ...

 

value должно быть целым. Оно удаляется со стека. Если value больше чем нуль, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за ifgt.

ifge

Переход, если больше или равно 0

ifge = 156

branchbyte1

branchbyte2

Стек: ..., value = > ...

 

value должно быть целым. Оно удаляется со стека. Если value больше или равно 0,

branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за ifge.

if_icmpeq

Переход, если целые равны

if_icmpeq = 159

branchbyte1

branchbyte2

Стек: ..., value1, value2 = > ...

 

value1 и value2 должны быть целыми. Их также удаляют со стека. Если value1 совпадает с value2, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается инструкции следующей за if_icmpeq.

if_icmpne

Переход, если целые не равны

if_icmpne = 160

branchbyte1

branchbyte2

Стек: ..., value1, value2 = > ...

 

value1 и value2 должны быть целыми. Они также удаляются со стека. Если value1 не совпадает с value2, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за if_icmpne.

if_icmplt

Переход, если целое меньше 0

if_icmplt = 161

branchbyte1

branchbyte2

Стек: ..., value1, value2 = > ...

 

value1 и value2 должны быть целыми. Они также удаляются со стека. Если value1 - меньше чем value2, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за if_icmplt.

if_icmpgt

Переход, если целое больше 0

if_icmpgt = 163

branchbyte1

branchbyte2

Стек: ..., value1, value2 = > ...

 

value1 и value2 должны быть целыми. Они также удаляются со стека Если value1 больше value2, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за if_icmpgt.

if_icmple

Переход, если целое меньше или равно

if_icmple = 164

branchbyte1

branchbyte2

Стек: ..., value1, value2 = > ...

 

value1 и value2 должны быть целыми. Они также удаляются со стека. Если value1 - меньше или равно value2, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за if_icmple.

if_icmpge

Переход, если целое больше или равно

if_icmpge = 162

branchbyte1

branchbyte2

Стек: ..., value1, value2 = > ...

 

value1 и value2 должны быть целыми. Они также удаляются со стека. Если value1 больше или равно value2, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за if_icmpge.

lcmp

Сравнение длинных целых

lcmp = 148

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word1 = > ...,

 

value1 и value2 должны быть длинными целыми. Они также удаляются со стека и сравниваются. Если value1 больше чем value2, целое значение “1” помещается на стек. Если value1 совпадает с value2, на стек помещается значение “0”. Если value1 - меньше чем value2, на стек помещается значение “-1”.

fcmpl

Сравнение вещественных одинарной точности (-1 при NaN)

fcmpl = 149

Стек: ..., value1, value2 = > ..., result

 

Value1 и value2 должны быть вещественными одинарной точности. Они удаляются со стека и сравниваются. Если value1 больше чем value2, значение “1” помещается на стек. Если value1 совпадает с value2, на стек помещается значение “0”. Если value1 - меньше чем value2, на стек помещается значение ”-1” .

Если или value1, или value2 - NaN, на стек помещается значение “-1”.

fcmpg

Сравнение вещественных одинарной точности (1 при NaN)

fcmpg = 150

Стек: ..., value1, value2 = > ..., result

 

value1 и value2 должны быть вещественными одинарной точности. Они удаляются со стека и сравниваются. Если value1 больше чем value2, значение “1” помещается на стек. Если value1 совпадает с value2, на стек помещается значение “0”. Если value1 - меньше чем value2, на стек помещается значение ”-1” .

Если или value1, или value2 - NaN, на стек помещается значение “1”.

dcmpl

Сравнение вещественных двойной точности(-1 при NaN)

dcmpl = 151

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word1 = > ..., result

 

value1 и value2 должны быть вещественными двойной точности. Они удаляются со стека и сравниваются. Если value1 больше чем value2, значение “1” помещается на стек. Если value1 совпадает с value2, на стек помещается значение “0”. Если value1 - меньше чем value2, на стек помещается значение ”-1” .

Если или value1, или value2 - NaN, на стек помещается значение “-1”.

dcmpg

Сравнение вещественных двойной точности(1 при NaN)

dcmpg = 152

Стек: ..., value1-word1, value1-word2, value2-word1, value2-word1 = > ..., result

 

value1 и value2 должны быть вещественными двойной точности. Они удаляются со стека и сравниваются. Если value1 больше чем value2, значение “1” помещается на стек. Если value1 совпадает с value2, на стек помещается значение “0”. Если value1 - меньше чем value2, на стек помещается значение ”-1” .

Если или value1, или value2 - NaN, на стек помещается значение “1”.

if_acmpeq

Переход, если ссылки на объект равны

if_acmpeq = 165

branchbyte1

branchbyte2

Стек: ..., value1, value2 = > ...

 

value1 и value2 должны быть ссылками на объекты. Они также удаляются со стека. Если объектные ссылки не одинаковые, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за if_acmpeq.

if_acmpne

Переход, если ссылки на объект не равны

if_acmpne = 166

branchbyte1

branchbyte2

Стек: ..., value1, value2 = > ...

 

value1 и value2 должны быть ссылками на объекты. Они также удаляются со стека. Если объектные ссылки не одинаковые, branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции. Иначе, исполнение продолжается с инструкции следующей за if_acmpne.

goto

Переход на

goto = 167

branchbyte1

branchbyte2

Стек: не меняется

 

branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции

goto_w

Переход на (расширенный индекс)

goto_w = 200

branchbyte1

branchbyte2

branchbyte3

branchbyte4

Стек: не меняется

 

branchbyte, branchbyte2, branchbyte3, и branchbyte4 используются для построения 32-битного смещения со знаком. Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции.

jsr

Переход на подпрограмму

jsr = 168

branchbyte1

branchbyte2

Стек: ... = > ..., return-address

 

branchbyte1 и branchbyte2 используются для построения 16-битного смещения со знаком. Адрес инструкции после работы jsr помещается на стек Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции.

Заметьте: jsr инструкция используется в реализации финального ключевого слова Явы.

jsr_w

Переход на подпрограмму (расширенный индекс)

jsr_w = 201

branchbyte1

branchbyte2

branchbyte3

branchbyte4

Стек: ... = > ..., return-address

 

branchbyte, branchbyte2, branchbyte3, и branchbyte4 используются для построения 32-битного смещения со знаком. Адрес инструкции после работы jsr_w помещается на стек Исполнение продолжается с места имеющего указанное смещение относительно адреса данной инструкции.

ret

Возврат из подпрограммы

ret = 169

vindex

Стек: не меняется

 

Локальная переменная vindex в среде выполнения Явы должна содержать адрес возврата. Состояние локальной переменной описано в рс.

Заметьте, что jsr кладет адрес на стек, а ret получает значение локальной переменной. Эта ассиметрия намеренна.

Заметьте: ret инструкция используется в реализации последнего ключевого слова Явы .

ret_w

Возврат из подпрограммы (расширенный индекс)

ret_w = 209

vindexbyte1

vindexbyte2

Стек: не меняется

 

Vindexbyte1 и vindexbyte2 ассемблируются в 16-битный беззнаковый индекс локальной переменной в среде выполнения Явы. Эта локальная переменная должна содержать адрес возврата. Состояние локальной переменной описано в рс.

См. ret инструкцию для получения большего количества информации.

3.12 Возврат из функции

ireturn

Возврат целого значения функции

ireturn = 172

Стек: ..., value = > [пусто]

 

value должно быть целым. Значение value помещается на стек предыдущей среды выполнения. Любые другие значения на стеке операндов уничтожаются. После чего интерпретатор возвращает контроль вызывающей программе.

lreturn

Возврат длинного целого значения функции

lreturn = 173

Стек: ..., value-word1, value-word2 = > [пусто]

 

value должно быть длинным целым. Значение value помещается на стек предыдущей среды выполнения. Любые другие значения на стеке операндов уничтожаются. После чего интерпретатор возвращает контроль вызывающей программе.

freturn

Возврат одинарного вещественного значения функции

freturn = 174

Стек: ..., value = > [пусто]

 

value должно быть вещественным числом одинарной точности. Значение value помещается на стек предыдущей среды выполнения. Любые другие значения на стеке операндов уничтожаются. После чего интерпретатор возвращает контроль вызывающей программе.

dreturn

Возврат двойного вещественного значения функции

dreturn = 175

Стек: ..., value-word1, value-word2 = > [пусто]

 

value должно быть числом с плавающей точкой двойной точности. Значение value помещается на стек предыдущей среды выполнения. Любые другие значения на стеке операндов уничтожаются. После чего интерпретатор возвращает контроль вызывающей программе.

areturn

Возврат объектной ссылки из функции

areturn = 176

Стек: ..., value = > [пусто]

 

value должно быть ссылкой на объект. Значение value помещается на стек предыдущей среды выполнения. Любые другие значения на стеке операндов уничтожаются. После чего интерпретатор возвращает контроль вызывающей программе.

return

Возврат(опустошающий) из процедуры

return = 177

Стек: ... = > [пусто]

Все значения на стеке операндов уничтожаются. После чего интерпретатор возвращает контроль вызывающей программе.

breakpoint

Остановка и передача контроля обработчику прерываний.

breakpoint = 202

Стек: не меняется

3.13 Переходы по таблице

tableswitch

Доступ к таблице перехода по индексу и переход

tableswitch = 170

...0-3 byte pad ...

default-offset1

default-offset2

default-offset3

default-offset4

low1

low2

low3

low4

high1

high2

high3

high4

... jump offsets ...

Стек: ..., index = > ...

 

tableswitch - это команда переменной длины. Немедленно после команды tableswitch , между нулем и тремя 0 помещенных как вставка такая, что следующий байт начинается с адреса кратного четырем. После вставки следуют последовательности знаковых 4-байтовых величин: default-offset, low, high, и затем high-low+1 с дальнейшими 4-байтовыми знаковыми смещениями. High-low+1 с 4-байтовые знаковые смещения используются как 0-основания таблицы перехода.

index должен быть целым. Если index меньше или больше чем high, то default-offset добавляется к адресу этой команды. Иначе, low вычитается из index, и элемент index-lowh таблицы перехода извлекается, и добавляется к адресу этой команды.

lookupswitch

Доступ к таблице перехода по сравнению с ключом и переход

 

lookupswitch = 171

...0-3 byte pad ...

default-offset1

default-offset2

default-offset3

default-offset4

npairs1

npairs2

npairs3

npairs4

...match-offset pairs ...

Стек: ..., key = > ...

 

tableswitch - это команда переменной длины. Немедленно после команды tableswitch между нулем и тремя 0 помещенных как вставка такая, что следующий байт начинается с адреса кратного четырем.

Немедленно после вставки следуют последовательности знаковых 4-байтовых величин. Первая пара- специальная. Первый элемент этой пары - default offset, а второй элемент этой пары представляет число следующих пар. Каждая последующая пара содержит значение, которое сравнивается со значением ключа, и смещение.

key должен быть целым. Целое значение key на стеке сравнивается с каждым значением. Если он равен одному из них, к адресу этой команды добавляется offset. Если ключ не соответствует никакому из значений, default-offset добавляется к адресу этой команды.

3.14 Управление полями объектов

putfield

Установка поля в объекте

putfield = 181

indexbyte1

indexbyte2

Стек: ..., objectref, value = > ...

ИЛИ

Стек: ..., objectref, value-word1, value-word2 = > ...

 

indexbyte1 и indexbyte2 используются для конструирования индекса в константном пуле текущего класса. Элементом константного пула будет поле ссылки на имя класса и имя поля. Этот элемент позволяет получить указатель на блок поля, который содержит размер поля (в байтах), и смещение поля (в байтах)

Значение поля с этим смещением от начала объекта, на который ссылается objectref, становится равным значению на вершине стека.

Эта команда имеет дело с полями шириной как 64-бита так и и с 32-битными.

Если objectref равно null, то генерируется NullPointerException .

Если указанное поле - статическое, генерируется IncompatibleClassChangeError.

getfield

Перенос поля из объекта

getfield = 180

indexbyte1

indexbyte2

Стек: ..., objectref = > ..., value

ИЛИ

Стек: ..., objectref = > ..., value-word1, value-word2

 

indexbyte1 и indexbyte2 используются для конструирования индекса в константном пуле текущего класса. Элементом константного пула будет поле ссылки на имя класса и имя поля. Этот элемент позволяет получить указатель на блок поля, который содержит размер поля (в байтах), и смещение поля (в байтах)

Значение поля с этим смещением от начала объекта, на который ссылается objectref, становится равным значению на вершине стека.

Эта команда имеет дело с полями шириной как 64-бита так и и с 32-битными.

Если objectref равно null, то генерируется NullPointerException .

Если указанное поле - статическое, генерируется IncompatibleClassChangeError.

putstatic

Установка статического поля в классе

putstatic = 179

indexbyte1

indexbyte2

Стек: ..., value = > ...

ИЛИ

Стек: ..., value-word1, value-word2 = > ...

 

indexbyte1 и indexbyte2 используются для конструирования индекса в константном пуле текущего класса. Элементом константного пула будет поле ссылки на статическое имя класса и имя поля.

Поле будет установлено так, что его значение будет находится на вершине стека.

Эта команда имеет дело с полями шириной как 64-бита так и с 32-битными.

Если указанное поле - динамическое, генерируется IncompatibleClassChangeError.

getstatic

Получение статического поля класса

getstatic = 178

indexbyte1

indexbyte2

Стек: ..., = > ..., value

ИЛИ

Стек: ..., = > ..., value-word1, value-word2

 

indexbyte1 и indexbyte2 используются для конструирования индекса в константном пуле текущего класса. Элементом константного пула будет поле ссылки на статическое поле класса .

Эта команда имеет дело с полями шириной как 64-бита так и и с 32-битными.

Если указанное поле - динамическое, генерируется IncompatibleClassChangeError.

3.15 Вызов метода

Имеются четыре команды для вызова реализации метода

invokevirtual

Вызывает метод экземпляра объекта, основываясь на типе объекта во время выполнения (виртуальном типе). Это обычный способ вызова методов в языке Ява.

invokenonvirtual

Вызывает метод экземпляра объекта, основываясь на не виртуальном типе объекта. Такой вызов используется, например, когда в качестве квалификатора метода записано ключевое слово super или имя суперкласса.

invokestatic

Вызывает статический метод в названном классе.

invokeinterface

Вызывает метод, который реализуется интерфейсом, отыскивая подходящий метод у объектов существующих во время выполнения.

invokevirtual

Вызывает метод экземпляра, основываясь на типе времени выполнения

invokevirtual = 182

indexbyte1

indexbyte2

Стек: ..., objectref, [arg1, [arg2 ...]], ... = > ...

 

Стек операндов должен содержать ссылку на объект и некоторое количество аргументов. indexbyte1 и indexbyte2 используются, для конструирования индекса в константном пуле текущего класса. Значение этого индекса в константном пуле содержит полную сигнатуру метода. Указатель на таблицу методов объекта получается из ссылки на объект. Сигнатура метода отыскивается в таблице методов. Гарантируется, что сигнатура метода будет совпадать ровно с одной из сигнатур методов в таблице.

Результат поиска - это индекс в таблице методов указанного класса, который используется вместе с динамическим типом объекта для поиска в таблице методов этого типа, где отыскивается указатель на блок искомого метода. Блок метода указывает на тип метода (native, synchronized и так далее) и число аргументов, ожидаемых на стеке операндов.

Если метод отмечен как синхронизированный (synchronized) , то происходит вход в монитор, связанный с objectref.

Objectref и аргументы снимаются со стека данного метода и становятся начальными значениями локальных переменных нового метода. Выполнение продолжается с первой инструкции нового метода.

Если ссылка на объект на стеке операндов пустая, генерируется NullPointerException. Если во время выполнения метода стек изменяется, генерируется StackOverflowError.

invokenonvirtual

Вызывает метод экземпляра, основываясь на не виртуальном типе

invokenonvirtual = 183

indexbyte1

indexbyte2

Стек: ..., objectref, [arg1, [arg2 ...]], ... = > ...

 

Стек операндов должен содержать ссылку на объект и некоторое количество аргументов. indexbyte1 и indexbyte2 используются, для конструирования индекса в константном пуле текущего класса. Значение этого индекса в константном пуле содержит полную сигнатуру метода. Указатель на таблицу методов объекта получается из ссылки на объект. Сигнатура метода отыскивается в таблице методов. Гарантируется, что сигнатура метода будет совпадать ровно с одной из сигнатур методов в таблице.

Результат поиска - это блок метода. Блок метода указывает на тип метода (native, synchronized и так далее) и число аргументов, ожидаемых на стеке операндов.

Если метод отмечен как синхронизированный (synchronized) , то происходит вход в монитор, связанный с objectref.

objectref и аргументы снимаются со стека данного метода и становятся начальными значениями локальных переменных нового метода. Выполнение продолжается с первой инструкции нового метода.

Если ссылка на объект на стеке операндов пустая, генерируется NullPointerException. Если во время выполнения метода стек изменяется, генерируется StackOverflowError.

invokestatic

Вызов метода класса (статического метода)

invokestatic = 184

indexbyte1

indexbyte2

Стек: ..., [arg1, [arg2 ...]], ... = > ...

 

Стек операндов должен содержать ссылку на объект и некоторое количество аргументов. indexbyte1 и indexbyte2 используются, для конструирования индекса в константном пуле текущего класса. Значение этого индекса в константном пуле содержит полную сигнатуру метода. Указатель на таблицу методов объекта получается из ссылки на объект. Сигнатура метода отыскивается в таблице методов. Гарантируется, что сигнатура метода будет совпадать ровно с одной из сигнатур методов в таблице.

Результат поиска - это блок метода. Блок метода указывает на тип метода (native, synchronized и так далее) и число аргументов, ожидаемых на стеке операндов.

Если метод отмечен как синхронизированный (synchronized) , то происходит вход в монитор, связанный с objectref.

Аргументы снимаются со стека данного метода и становятся начальными значениями локальных переменных нового метода. Выполнение продолжается с первой инструкции нового метода.

Если ссылка на объект на стеке операндов пустая, генерируется NullPointerException. Если во время выполнения метода стек изменяется, генерируется StackOverflowError.

invokeinterface

Вызывает метод интерфейса

invokeinterface = 185

indexbyte1

indexbyte2

nargs

reserved

Стек: ..., objectref, [arg1, [arg2 ...]], ... = > ...

 

Стек операндов должен содержать ссылку на объект и аргументов nargs-1. indexbyte1 и indexbyte2 используются, для конструирования индекса в константном пуле текущего класса. Значение этого индекса в константном пуле содержит полную сигнатуру метода. Указатель на таблицу методов объекта получается из ссылки на объект. Сигнатура метода отыскивается в таблице методов. Гарантируется, что сигнатура метода будет совпадать ровно с одной из сигнатур методов в таблице.

Результат поиска - это блок метода. Блок метода указывает на тип метода (native, synchronized и так далее), исключая invokevirtual и invokenonvirtual, число аргументов (nargs) берется из байткода.

Если метод отмечен как синхронизированный (synchronized) , то происходит вход в монитор, связанный с objectref.

Objectref и аргументы снимаются со стека данного метода и становятся начальными значениями локальных переменных нового метода. Выполнение продолжается с первой инструкции нового метода.

Если ссылка на объект на стеке операндов пустая, генерируется NullPointerException. Если во время выполнения метода стек изменяется, генерируется StackOverflowError.

3.16 Обработка исключений

athrow

Генерация обработки или ошибки

athrow = 191

Стек: ..., objectref = > [undefined]

 

Objectref должен быть ссылкой на объект, который является подклассом сгенерирванной Throwable. Текущее состояние стека в языке Ява исследуется наибольшим найденным оператором, который находит этот класс или суперкласс этого класса. Если обнаружено совпадение с элементом списка кетч, то PC устанавливается на адрес, указанный в элементе списка кетч, и выполнение продолжается.

Если соответствующее предложение кетч не найдено в текущем состоянии стека, то состояние удаляется, и объект повторно генерируется. Если оно найдено, оно содержит местоположение кода для этого исключения. PC повторно устанавливается на это местоположение и выполнение продолжается. Если никакой соответствующий кетч не найден в текущем состоянии стека, то блок удаляется, и objectref повторно генерируется.

Если objectref null, генерируется NullPointerException.

3.17 Прочие операции с объектами

new

Создает новый объект

new = 187

indexbyte1

indexbyte2

Стек: ... = > ..., objectref

 

indexbyte1 и indexbyte2 используются для конструирования индекса в константном пуле текущего класса. Элемент с этим индексом должен быть именем класса, по которому можно получить указатель на класс. Создается новый экземпляр этого класса и ссылка на объект помещается на стек.

checkcast

Проверяет, что объект имеет данный тип

checkcast = 192

indexbyte1

indexbyte2

Стек: ..., objectref = > ..., objectref

 

indexbyte1 и indexbyte2 используются для конструирования индекса в константном пуле текущего класса. Предполагается, что строка с этим индексом в константном пуле является именем класса, которое позволяет получить указатель на класс, class. objectref должен быть ссылкой на объект.

checkcast определяет, может ли objectref быть преобразован так, чтобы быть ссылкой на объект класса class. Пустой указатель objectref может быть преобразован в любой class. Иначе говоря, упомянутый объект должен быть экземпляром класса или одного из его суперклассов. (См. спецификацию языка Ява для подробной информации относительно того, как определять является ли objectref экземпляром класса.) Если objectref может быть преобразован в class, выполнение продолжается со следующей инструкции, и objectref остается на стеке.

Если objectref не может быть преобразован в class, генерируется ClassCastException.

Заметьте: Не надо ссылаться на спецификацию языка Ява; дайте семантику прямо здесь

instanceof

Определяет, имеет ли объект данный тип

instanceof = 193

indexbyte1

indexbyte2

 

Стек: ..., objectref = > ..., result

 

indexbyte1 и indexbyte2 используются для конструирования индекса в константном пуле текущего класса. Предполагается, что строка с этим индексом в константном пуле является именем класса, которое позволяет получить указатель на класс, class. objectref должен быть ссылкой на объект.

instanceof определяет, может ли objectref быть преобразован так, чтобы быть ссылкой на объект класса class. Эта команда будет переопределять objectref с 1, если objectref является экземпляром класса или одного из его суперклассов. (См. спецификацию языка Ява для подробной информации относительно того, как определять является ли указатель на объект экземпляром класса). Иначе, objectref переопределять с 0. Если objectref – null, его переопределяют с 0.

Заметьте: Не надо ссылаться на спецификацию языка Ява; дайте семантику прямо здесь

3.18 Мониторы

monitorenter

Вход в контролируемую область кода

monitorenter = 194

 

Стек: ..., objectref = > ...

 

objectref должен быть ссылкой на объект.

Интерпретатор пытается получать исключительный доступ через механизм блокировки к objectref. Если другой поток уже имеет установленную objectref, то текущий поток ждет, пока объект не будет установлен. Если текущий поток уже имеет установленный объект, то продолжается выполнение. Если объект не блокирован, то получается исключительная блокировка.

Если objectref null, генерируется NullPointerException.

monitorexit

monitorexit = 195

Выход из контролируемой области кода

Стек: ..., objectref = > ...

 

objectref должно быть ссылкой на объект.

Объект разблокировывается. Если это - последняя установка, то этот поток остается на объекте (одному потоку позволяется иметь многократные установки на одном и том же объекте), тогда другим потокам, которые ожидают доступный объект, разрешается продолжать.

Если objectref null, генерируется NullPointerException.