Форматы исполняемых инструкций Dalvik

На этой странице перечислены форматы инструкций, используемые исполняемым форматом 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, #+BBBB0000
op vAA, #+BBBB000000000000
 
21c op vAA, type@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op 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@CCCC
op 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@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

где NNNN = CCCC+AA-1, то есть A определяет количество 0..255, а C определяет первый регистр

 
3rms op {vCCCC .. vNNNN}, vtaboff@BBBB

где NNNN = CCCC+AA-1, то есть A, определяет количество 0..255, а C – первый регистр.

рекомендуемый формат для статически связанных invoke-virtual и инструкции invoke-super формата 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

где NNNN = CCCC+AA-1, то есть A, определяет количество 0..255, а C определяет первый регистр.

рекомендуемый формат для встроенных связанных инструкций 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

где NNNN = CCCC+AA-1, то есть A определяет количество 0..255, а C определяет первый регистр

invoke-polymorphic/range
AA|op BBBBlo BBBB BBBB BBBBhi 51L op vAA, #+BBBBBBBBBBBBBBBB const-wide