На этой странице перечислены форматы инструкций, используемые в формате исполняемого файла Dalvik (DEX) и байт-коде Dalvik. Он предназначен для использования вместе со справочным документом по байт-коду .
Побитовые описания
 В первом столбце таблицы формата указана поразрядная структура формата. Он состоит из одного или нескольких «слов», разделенных пробелами, каждое из которых описывает 16-битную кодовую единицу. Каждый символ в слове представляет собой четыре бита, считываемые от старших битов к младшим, с вертикальными полосами (« | »), перемежающимися для облегчения чтения. Прописные буквы в последовательности от « A » используются для обозначения полей в формате (которые затем определяются в столбце синтаксиса). Термин « op » используется для обозначения позиции восьмибитного кода операции в формате. Перечеркнутый ноль (« Ø ») используется для обозначения того, что все биты в указанной позиции должны быть равны нулю.
По большей части буквы переходят от более ранних кодовых единиц к более поздним, а также от низкого порядка к высшему внутри кодовой единицы. Однако из этого общего правила есть несколько исключений, которые сделаны для того, чтобы имена частей с одинаковым значением были одинаковыми в разных форматах команд. Эти случаи явно отмечены в описаниях формата.
 Например, формат « B|A| op CCCC » указывает, что формат состоит из двух 16-битных кодовых единиц. Первое слово состоит из кода операции в младших восьми битах и пары четырехбитных значений в старших восьми битах; а второе слово состоит из одного 16-битного значения.
Идентификаторы формата
Во втором столбце таблицы форматов указан короткий идентификатор формата, который используется в других документах и в коде для идентификации формата.
 Большинство идентификаторов формата состоят из трех символов: двух цифр, за которыми следует буква. Первая цифра указывает количество 16-битных кодовых единиц в формате. Вторая цифра указывает максимальное количество регистров, которые содержит формат (максимум, поскольку некоторые форматы могут содержать переменное количество регистров), при этом специальное обозначение « r » указывает на то, что закодирован диапазон регистров. Последняя буква полумнемонически указывает тип любых дополнительных данных, закодированных в этом формате. Например, формат « 21t » имеет длину два, содержит одну ссылку на регистр и дополнительно содержит цель ветвления.
 Предлагаемые форматы статических ссылок имеют дополнительный суффикс « s », что делает их всего четырьмя символами. Аналогично, предлагаемые «встроенные» форматы ссылок имеют дополнительный суффикс « i ». (В этом контексте встроенное связывание похоже на статическое связывание, за исключением более прямых связей с реализацией машины.) Наконец, пара странных предлагаемых форматов (например, « 20bc ») включает два фрагмента данных, каждый из которых представлен в своем идентификаторе формата. .
Полный список букв типового кода выглядит следующим образом. Обратите внимание, что некоторые формы имеют разные размеры в зависимости от формата:
| Мнемоника | Размер бита | Значение | 
|---|---|---|
| б | 8 | немедленная подпись байта | 
| с | 16, 32 | c постоянный индекс пула | 
| ж | 16 | константы интерфейса (используются только в статически связанных форматах) | 
| час | 16 | немедленный знак h at (старшие биты 32- или 64-битного значения; все младшие биты равны 0) | 
| я | 32 | немедленный подписанный in nt или 32-битное число с плавающей запятой | 
| л | 64 | немедленный длинный со знаком или 64-битный двойной | 
| м | 16 | Константы метода m (используются только в статически связанных форматах) | 
| н | 4 | немедленный подписанный и невозможный | 
| с | 16 | немедленное подписание короткометражки | 
| т | 8, 16, 32 | целевая ветка | 
| Икс | 0 | никаких дополнительных данных | 
Синтаксис
Третий столбец таблицы форматов указывает ориентированный на человека синтаксис для инструкций, использующих указанный формат. Каждая инструкция начинается с именованного кода операции и может сопровождаться одним или несколькими аргументами, разделенными запятыми.
 Если аргумент ссылается на поле из первого столбца, буква этого поля указывается в синтаксисе и повторяется один раз для каждых четырех битов поля. Например, восьмибитовое поле с меткой « BB » в первом столбце также будет иметь метку « BB » в столбце синтаксиса.
 Аргументы, которые называют регистр, имеют форму « v X ». Префикс « v » был выбран вместо более распространенного « r » именно во избежание конфликта с (невиртуальными) архитектурами, на которых может быть реализован формат исполняемого файла Dalvik, которые сами используют префикс « r » для своих регистров. (То есть это решение позволяет говорить и о виртуальных, и о реальных регистрах одновременно, без необходимости многословия.)
 Аргументы, обозначающие буквальное значение, имеют форму « #+ X ». Некоторые форматы указывают литералы, у которых есть только ненулевые биты в старших битах; для них нули явно представлены в синтаксисе, даже если они не появляются в побитовом представлении.
 Аргументы, указывающие относительное смещение адреса инструкции, имеют форму « + X ».
 Аргументы, указывающие буквальный индекс пула констант, имеют форму « kind @ X », где « kind » указывает, к какому пулу констант относится ссылка. Каждый код операции, использующий такой формат, явно допускает только один вид констант; см. ссылку на код операции, чтобы выяснить соответствие. Типы пула констант: « string » (индекс пула строк), « type » (индекс пула типов), « field » (индекс пула полей), « meth » (индекс пула методов) и « site » (индекс сайта вызова). ).
 Подобно представлению постоянных индексов пула, существуют также предлагаемые (необязательные) формы, которые указывают предварительно связанные смещения или индексы. Существует два типа предлагаемых предварительно связанных значений: смещения vtable (обозначаются как « vtaboff ») и смещения полей (обозначаются как « fieldoff »).
 В тех случаях, когда значение формата не является явно частью синтаксиса, а вместо этого выбирает вариант, каждый вариант указывается с префиксом « [ X = N ] » (например, « [A=2] »), чтобы указать соответствие .
Форматы
| Формат | ИДЕНТИФИКАТОР | Синтаксис | Описаны известные опкоды | 
|---|---|---|---|
| Н/Д | 00х | N/A | псевдоформат, используемый для неиспользуемых кодов операций; предлагается для использования в качестве номинального формата для кода операции точки останова. | 
| ØØ| оп | 10x | op | |
| Б|А| оп | 12x | opва, вб | |
| 11н | opвА, #+B | ||
| АА| оп | 11x | opваа | |
| 10т | op+АА | идти к | |
| ØØ| оп АААА | 20т | op+АААА | перейти/16 | 
| АА| оп BBBB | 20 г. до н.э. | opАА, добрый@BBBB | предлагаемый формат статически определяемых ошибок проверки; A — тип ошибки, а B — индекс в таблице, соответствующей типу (например, ссылки на методы для ошибки, не связанной с таким методом). | 
| АА| оп BBBB | 22x | opваА, вББББ | |
| 21т | opваа, +BBBB | ||
| 21 с | opваа, #+BBBB | ||
| 21 час | opваа, #+BBBB0000opвАА, #+BBBB000000000000 | ||
| 21в | opвАА, тип@BBBBopвАА, поле@BBBBopвАА, Method_handle@BBBBopвАА, прото@BBBBopваа, строка@BBBB | проверка константный класс дескриптор константного метода тип константного метода константная строка | |
| АА| оп CC|BB | 23x | opvAA, vBB, vCC | |
| 22б | opvAA, vBB, #+CC | ||
| Б|А| оп CCCC | 22т | opvA, vB, +CCCC | |
| 22 секунды | opvA, vB, #+CCCC | ||
| 22в | opvA, vB, тип@CCCCopvA, vB, поле@CCCC | случай | |
| 22кс | opvA, vB, fieldoff@CCCC | предлагаемый формат для инструкций доступа к статически связанным полям формата 22c | |
| ØØ| оп АААА ло АААА привет | 30т | op+АААААААА | перейти/32 | 
| ØØ| оп АААА ББББ | 32x | opваааа, вBBBB | |
| АА| оп BBBB ло BBBB привет | 31я | opваа, #+BBBBBBBB | |
| 31т | opваа, +BBBBBBBB | ||
| 31с | opвАА, string@BBBBBBBB | константная строка/джамбо | |
| А|Г| оп BBBB F|E|D|C | 35с | [ A=5]op{vC, vD, vE, vF, vG}, meth@BBBB[ A=5]op{vC, vD, vE, vF, vG}, site@BBBB[ A=5]op{vC, vD, vE, vF, vG}, type@BBBB[ A=4]op{vC, vD, vE, vF},kind@BBBB[ A=3]op{vC, vD, vE},kind@BBBB[ A=2]op{vC, vD},kind@BBBB[ A=1]op{vC},kind@BBBB[ A=0]op{},kind@BBBBНеобычный выбор букв здесь отражает желание сделать так, чтобы счетчик и индекс ссылки имели ту же метку, что и в формате 3rc. | |
| 35 мс | [ A=5]op{vC, vD, vE, vF, vG}, vtaboff@BBBB[ A=4]op{vC, vD, vE, vF}, vtaboff@BBBB[ A=3]op{vC, vD, vE}, vtaboff@BBBB[ A=2]op{vC, vD}, vtaboff@BBBB[ A=1]op{vC}, vtaboff@BBBBНеобычный выбор букв здесь отражает желание сделать так, чтобы число и индекс ссылки имели ту же метку, что и в формате 3rms. | предлагаемый формат для статически связанных инструкций invoke-virtualиinvoke-superформата 35c | |
| 35 миль | [ A=5]op{vC, vD, vE, vF, vG}, inline@BBBB[ A=4]op{vC, vD, vE, vF}, inline@BBBB[ A=3]op{vC, vD, vE}, inline@BBBB[ A=2]op{vC, vD}, inline@BBBB[ A=1]op{vC}, inline@BBBBНеобычный выбор букв здесь отражает желание сделать так, чтобы количество и ссылочный индекс имели ту же метку, что и в формате 3rmi. | предлагаемый формат для встроенных связанных инструкций invoke-staticиinvoke-virtualформата 35c | |
| АА| оп BBBB CCCC | 3RC | op{vCCCC .. vNNNN}, meth@BBBBop{vCCCC .. vNNNN}, site@BBBBop{vCCCC .. vNNNN}, введите @BBBB где  | |
| 3среднеквадр. | op{vCCCC .. vNNNN}, vtaboff@BBBB где  | предлагаемый формат для статически связанных инструкций invoke-virtualиinvoke-superформата3rc | |
| 3рми | op{vCCCC .. vNNNN}, inline@BBBB где  | предлагаемый формат для встроенных связанных инструкций invoke-staticиinvoke-virtualформата 3rc | |
| А|Г| оп BBBB F|E|D|C HHHH | 45cc | [ A=5]op{vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH[ A=4]op{vC, vD, vE, vF}, meth@BBBB, proto@HHHH[ A=3]op{vC, vD, vE}, meth@BBBB, proto@HHHH[ A=2]op{vC, vD}, meth@BBBB, proto@HHHH[ A=1]op{vC}, meth@BBBB, proto@HHHH | вызвать-полиморфный | 
| АА| оп BBBB CCCC ХХХХ | 4RCC | op>{vCCCC .. vNNNN}, meth@BBBB, proto@HHHH где  | вызвать-полиморфный/диапазон | 
| АА| оп BBBB ло BBBB BBBB BBBB привет | 51л | opваа, #+BBBBBBBBBBBBBBBB | константный | 
