3 Набор инструкций виртуальной машины
3.2 - Загрузка констант в стек
3.3 - Загрузка локальных переменных в стек
3.4 - Сохранение значений стека в локальных переменных
3.5 - Расширенный индекс для загрузки, сохранения и приращения
- Управление массивами3.8 - Арифметические инструкции
3.10 - Операции преобразования
3.11 - Инструкции передачи управления
3.14 - Управление полями объектов
3.17 - Прочие операции с объектами
Инструкции для виртуальной машины языка Ява представлены в этом документе
в следующей форме.
Название инструкции
Короткое
описание инструкции
opcode = number |
operand1 |
operand2 |
... |
Стек: ..., value1, value2 = > ..., value
3
Более подробное
описание, объясняющее функции инструкции и указывающее все исключения, которые могли бы быть сгенерированы при выполнении.Каждая строка в синтаксической диаграмме представляет собой 8-битный байт, определяемый единственным образом.
В виртуальной машине языка Ява операции производятся над элементами стека и результаты помещаются обратно в стек. Обычно не оговаривают является ли стек источником или приемником операндов, но при необходимости это будет уточняться.
Например, инструкция iload имеет короткое описание "Загрузка целого значения
из локальной переменной." .Подразумевается, что оно загружается в стек. Инструкция iadd обозначает "Сложение целых"; в данном случае стек является источником и
приемником.
Считается, что инструкции, которые не влияют на поток управления всегда продвигают PC виртуальной машины на код операции следующей инструкции. Только для инструкций, которые влияют на поток управления будет явно указываться как они влияют на PC-счетчик
.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-w
ord1, 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-битный индекс локальной переменной в текущем окружении. Следующий байткод исполняется как обычно за исключением того, что использует расширенный индекс. Управление массивами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.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, an
y1
Меняет местами два элемента на вершине стека.
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 = > ..., re
sult-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 должно быть вещественным числом двойной точности. Оно заменяется в стеке арифметическим отрицанием.
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 оба должны быть длинными целыми. Они заменяются в стеке их исключающим ИЛИ (исключающей дизъюнкцией).
.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 |
Стек: ... = > ..., ret
urn-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 инструкцию для получения большего количества информации.
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 |
Стек: не меняется
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.Имеются четыре команды для вызова реализации метода
invokevirtual
Вызывает метод экземпляра объекта, основываясь на типе объекта во время выполнения (виртуальном типе). Это обычный способ вызова методов в языке Ява.
invokenonvirtual
Вызывает метод экземпляра объекта, основываясь на не виртуальном типе объекта. Такой вызов используется, например, когда в качестве квалификатора метода записано ключевое слово
super или имя суперкласса.invokestatic
Вызывает статический метод в названном классе.
invokeinterface
Вызывает метод, который реализуется интерфейсом, отыскивая подходящий метод у
объектов существующих во время выполнения.invokevirtual
Вызывает метод экземпляра, основываясь на типе времени выполнения
invokevirtual = 182 |
indexbyte1 |
indexbyte2 |
Стек: ..., objectref,
[arg1, [arg2 ...]], ... = > ...
Стек операндов должен содержать ссылку на объект и некоторое количество аргументов. indexbyte1 и indexbyte2 используются, для конструирования индекса в константном пуле текущего класса. Значение этого индекса в константном пуле содержит полную сигнатуру метода. Указатель на таблицу методов объекта получается из ссылки на объект. Сигнатура метода отыскивается в таблице методов. Гарантируется, что сигнатура метода будет совпадать ровно с одной из сигнатур методов в таблице.
Результат поиска - это индекс в таблице методов указанного класса, который используется вместе с динамическим типом объекта для поиска в таблице методов этого типа, где отыскивается указатель на блок искомого метода. Блок метода указывает на тип метода (
native, synchronized и так далее) и число аргументов, ожидаемых на стеке операндов.Если метод отмечен как синхронизированный (
synchronized) , то происходит вход в монитор, связанный с objectref.Objectref и аргументы снимаются со стека данного метода и становятся начальными значениями локальных переменных нового метода. Выполнение продолжается с первой инструкции нового метода.
Если ссылка на объект на стеке операндов пустая, генерируется
invokenonvirtual
Вызывает метод экземпляра, основываясь на не виртуальном типе
invokenonvirtual = 183 |
indexbyte1 |
indexbyte2 |
Стек: ..., objectref, [arg1, [arg2 ...]], ... = > ...
Стек операндов должен содержать ссылку на объект и некоторое количество аргументов. indexbyte1 и indexbyte2 используются, для конструирования индекса в константном пуле текущего класса. Значение этого индекса в константном пуле содержит полную сигнатуру метода. Указатель на таблицу методов объекта получается из ссылки на объект. Сигнатура метода отыскивается в таблице методов. Гарантируется, что сигнатура метода будет совпадать ровно с одной из сигнатур методов в таблице.
Результат поиска - это блок метода. Блок метода указывает на тип метода (
native, synchronized и так далее) и число аргументов, ожидаемых на стеке операндов.Если метод отмечен как синхронизированный (
synchronized) , то происходит вход в монитор, связанный с objectref.objectref и аргументы снимаются со стека данного метода и становятся начальными значениями локальных переменных нового метода. Выполнение продолжается с первой инструкции нового метода.
Если ссылка на объект на стеке операндов пустая, генерируется
invokestatic
Вызов метода класса (статического метода)
invokestatic = 184 |
indexbyte1 |
indexbyte2 |
Стек: ..., [arg1, [arg2 ...]], ... = > ...
Стек операндов должен содержать ссылку на объект и некоторое количество аргументов. indexbyte1 и indexbyte2 используются, для конструирования индекса в константном пуле текущего класса. Значение этого индекса в константном пуле содержит полную сигнатуру метода. Указатель на таблицу методов объекта получается из ссылки на объект. Сигнатура метода отыскивается в таблице методов. Гарантируется, что сигнатура метода будет совпадать ровно с одной из сигнатур методов в таблице.
Результат поиска - это блок метода. Блок метода указывает на тип метода (
native, synchronized и так далее) и число аргументов, ожидаемых на стеке операндов.Если метод отмечен как синхронизированный (
synchronized) , то происходит вход в монитор, связанный с objectref.Аргументы снимаются со стека данного метода и становятся начальными значениями локальных переменных нового метода. Выполнение продолжается с первой инструкции нового метода.
Если ссылка на объект на стеке операндов пустая, генерируется
invokeinterface
Вызывает метод интерфейса
invokeinterface = 185 |
indexbyte1 |
indexbyte2 |
nargs |
reserved |
Стек: ..., objectref, [arg1, [arg2 ...]], ... = > ...
Стек операндов должен содержать ссылку на объект и аргументов nargs-1. indexbyte1 и indexbyte2 используются, для конструирования индекса в константном пуле текущего класса. Значение этого индекса в константном пуле содержит полную сигнатуру метода. Указатель на таблицу методов объекта получается из ссылки на объект. Сигнатура метода отыскивается в таблице методов. Гарантируется, что сигнатура метода будет совпадать ровно с одной из сигнатур методов в таблице.
Результат поиска - это блок метода. Блок метода указывает на тип метода (
native, synchronized и так далее), исключая invokevirtual и invokenonvirtual, число аргументов (nargs) берется из байткода.Если метод отмечен как синхронизированный (
synchronized) , то происходит вход в монитор, связанный с objectref.Objectref и аргументы снимаются со стека данного метода и становятся начальными значениями локальных переменных нового метода. Выполнение продолжается с первой инструкции нового метода.
Если ссылка на объект на стеке операндов пустая, генерируется
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.Заметьте: Не надо ссылаться на спецификацию языка Ява; дайте семантику прямо здесь
monitorenter
Вход в контролируемую область кода
monitorenter = 194 |
Стек: ..., objectref = > ...
objectref должен быть ссылкой на объект.
Интерпретатор пытается получать исключительный доступ через механизм блокировки к objectref. Если другой поток уже имеет установленную objectref, то текущий поток ждет, пока объект не будет установлен. Если текущий поток уже имеет установленный объект, то продолжается выполнение. Если объект не блокирован, то получается исключительная блокировка.
Если objectref
null, генерируется NullPointerException.monitorexit
monitorexit = 195 |
Выход из контролируемой области кода
Стек: ..., objectref = > ...
objectref должно быть ссылкой на объект
.Объект разблокировывается. Если это - последняя установка, то этот поток остается на объекте (одному потоку позволяется иметь многократные установки на одном и том же объекте), тогда другим потокам, которые ожидают доступный объект, разрешается продолжать.
Если objectref
null, генерируется NullPointerException.