На этой странице перечислены форматы инструкций, используемые исполняемым форматом Dalvik (DEX) и байт-кодом Dalvik. Его следует использовать вместе с документом по байт-коду.
Побитовые описания
В первом столбце таблицы форматов перечислены битовые макеты форматов. Он состоит из одного или нескольких "слов", разделенных пробелами, каждое из которых описывает 16-битовую единицу кода. Каждый символ в слове представляет четыре бита, которые считываются от старших к младшим. Для удобства чтения они разделены вертикальными чертами (|). Заглавные буквы, начиная с A, используются для обозначения полей в формате (которые затем определяются в столбце синтаксиса). Термин op используется для обозначения позиции восьмибитного операционного кода в формате. Перечеркнутый ноль (Ø) означает, что все биты в указанной позиции должны быть нулевыми.
В большинстве случаев буквы следуют от более ранних элементов кода к более поздним, а также от младших к старшим в пределах одного элемента кода. Однако есть несколько исключений из этого общего правила, которые сделаны для того, чтобы названия частей с похожим значением были одинаковыми в разных форматах инструкций. Такие случаи явно указаны в описаниях форматов.
Например, формат "B|A|op CCCC" означает, что он состоит из двух 16-битных единиц кода. Первое слово состоит из кода операции в младших восьми битах и пары четырехбитных значений в старших восьми битах, а второе слово состоит из одного 16-битного значения.
Идентификаторы форматов
Во втором столбце таблицы форматов указан короткий идентификатор формата, который используется в других документах и в коде для идентификации формата.
Большинство идентификаторов формата состоят из трех символов: двух цифр и буквы. Первая цифра указывает на количество 16-битных кодовых единиц в формате. Вторая цифра обозначает максимальное количество регистров, которые могут быть в формате (максимальное, поскольку некоторые форматы могут содержать переменное количество регистров). Специальное обозначение "r" указывает на то, что закодирован диапазон регистров. Последняя буква полумнемонически указывает на тип дополнительных данных, закодированных в формате. Например, формат "21t" имеет длину два, содержит одну ссылку на регистр и дополнительно содержит цель перехода.
Предлагаемые форматы статических ссылок имеют дополнительный суффикс "s", поэтому состоят из четырех символов. Аналогично, предложенные форматы ссылок "встроенные" имеют дополнительный суффикс "i". (В этом контексте встроенная связь похожа на статическую, но более непосредственно связана с реализацией на устройстве.)
Наконец, в некоторых необычных форматах (например, "20bc") содержатся два фрагмента данных, которые представлены в идентификаторе формата.
Ниже приведен полный список букв, обозначающих типы. Обратите внимание, что некоторые формы имеют разные размеры в зависимости от формата:
| Мнемоника | Размеры битов | Значение |
|---|---|---|
| b | 8 | непосредственный байт со знаком (byte) |
| c | 16, 32 | constant pool index |
| f | 16 | константы interface (используются только в форматах со статической компоновкой); |
| ч. | 16 | непосредственное знаковое значение hat (старшие биты 32- или 64-битного значения; младшие биты – все 0)
|
| i | 32 | непосредственное целое число со знаком int или 32-битное число с плавающей запятой; |
| l | 64 | непосредственное значение типа long со знаком или 64-битное значение типа double |
| м | 16 | Константы method (используются только в форматах со статической компоновкой) |
| n | 4 | немедленно подписанный nibble |
| сек. | 16 | immediate signed short |
| t | 8, 16, 32 | branch target |
| x | 0 | нет дополнительных данных; |
Синтаксис
В третьем столбце таблицы форматов указан синтаксис инструкций, использующих указанный формат, который удобен для восприятия человеком. Каждая инструкция начинается с названия кода операции, за которым могут следовать один или несколько аргументов, разделенных запятыми.
Если аргумент относится к полю из первого столбца, в синтаксисе указывается буква этого поля, повторяющаяся один раз для каждых четырех битов поля. Например, восьмибитное поле с названием
"BB" в первом столбце будет иметь такое же название
BB в столбце синтаксиса.
Аргументы, которые называют регистр, имеют форму "vX".
Префикс "v" был выбран вместо более распространенного
"r" именно для того, чтобы избежать конфликта с (невиртуальными) архитектурами,
на которых может быть реализован формат Dalvik Executable, которые сами
используют префикс "r" для своих регистров. (То есть это решение позволяет говорить о виртуальных и реальных регистрах вместе, не прибегая к окольным выражениям.)
Аргументы, указывающие на литеральное значение, имеют форму "#+X". В некоторых форматах литералы, у которых ненулевые биты есть только в старших битах, указываются с явным представлением нулей в синтаксисе, даже если в побитовом представлении их нет.
Аргументы, указывающие смещение адреса относительной инструкции, имеют вид "+X".
Аргументы, указывающие на индекс пула литеральных констант, имеют вид kind@X, где kind указывает, на какой пул констант делается ссылка. Каждый код операции, использующий такой формат, явно разрешает только один тип константы. Чтобы узнать, какой именно, обратитесь к справочнику по кодам операций. Существуют следующие типы пулов констант: string (индекс пула строк), type (индекс пула типов), field (индекс пула полей), meth (индекс пула методов) и site (индекс сайта вызова).
Как и в случае с индексами пула констант, существуют также рекомендуемые (необязательные) формы, которые указывают на предварительно связанные смещения или индексы. Существует два типа предложенных значений: смещения таблицы виртуальных функций (обозначаются как "vtaboff") и смещения полей (обозначаются как "fieldoff").
Если значение формата не является частью синтаксиса, а выбирается из вариантов, каждый вариант указывается с префиксом "[X=N]" (например, "[A=2]"), чтобы показать соответствие.
Форматы
| Формат | ID | Синтаксис | Основные коды операций |
|---|---|---|---|
| – | 00x | N/A |
Псевдоформат, используемый для неиспользуемых кодов операций; рекомендуется использовать в качестве номинального формата для кода операции точки останова |
| ØØ|op | 10x | op |
|
| Б|А|op | 12x | op vA, vB |
|
| 11n | op vA, #+B |
||
| AA|op | 11x | op vAA |
|
| 10t | op +AA |
goto | |
| ØØ|op AAAA | 20 т | op +AAAA |
goto/16 |
| AA|op BBBB | 20bc | op AA, kind@BBBB |
Рекомендуемый формат для статически определенных ошибок проверки.A – тип ошибки, а B – индекс в таблице, соответствующей типу (например, ссылки на методы для ошибки "метод не найден"). |
| AA|op BBBB | 22x | op vAA, vBBBB |
|
| 21t | op vAA, +BBBB |
||
| 21 подъем штанги на бицепс | op vAA, #+BBBB |
||
| 21 ч. | op vAA, #+BBBB0000op vAA, #+BBBB000000000000
|
||
| 21c | op vAA, type@BBBBop vAA, field@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop vAA, string@BBBB
|
check-cast const-class const-method-handle const-method-type const-string |
|
| AA|op CC|BB | 23x | op vAA, vBB, vCC |
|
| 22b | op vAA, vBB, #+CC |
||
| Б|А|op CCCC | 22t | op vA, vB, +CCCC |
|
| 22 сек. | op vA, vB, #+CCCC |
||
| 22c | op vA, vB, type@CCCCop vA, vB, field@CCCC
|
instance-of | |
| 22cs | op vA, vB, fieldoff@CCCC |
рекомендуемый формат для инструкций по доступу к статически связанным полям формата 22c | |
| ØØ|op AAAAlo AAAAhi | 30t | op +AAAAAAAA |
goto/32 |
| ØØ|op AAAA BBBB | 32x | op vAAAA, vBBBB |
|
| AA|op BBBBlo BBBBhi | 31i | op vAA, #+BBBBBBBB |
|
| 31t | op vAA, +BBBBBBBB |
||
| 31c | op vAA, string@BBBBBBBB |
const-string/jumbo | |
| A|G|op BBBB F|E|D|C | 35c | [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
|
|
| AA|op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBгде |
|
| 3rms | op {vCCCC .. vNNNN}, vtaboff@BBBBгде |
рекомендуемый формат для статически связанных invoke-virtual
и инструкции invoke-super формата 3rc
|
|
| 3rmi | op {vCCCC .. vNNNN}, inline@BBBBгде |
рекомендуемый формат для встроенных связанных инструкций invoke-static
и invoke-virtual формата 3rc
|
|
| A|G|op 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
|
invoke-polymorphic |
| AA|op BBBB CCCC HHHH | 4rcc |
op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH
где |
invoke-polymorphic/range |
| AA|op BBBBlo BBBB BBBB BBBBhi | 51L | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |