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

На этой странице перечислены форматы инструкций, используемые в формате исполняемого файла 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 ваа, #+BBBB0000
op вАА, #+BBBB000000000000
21в op вАА, тип@BBBB
op вАА, поле@BBBB
op вАА, Method_handle@BBBB
op вАА, прото@BBBB
op ваа, строка@BBBB
проверка
константный класс
дескриптор константного метода
тип константного метода
константная строка
АА| оп CC|BB 23x op vAA, vBB, vCC
22б op vAA, vBB, #+CC
Б|А| оп CCCC 22т op vA, vB, +CCCC
22 секунды op vA, vB, #+CCCC
22в op vA, vB, тип@CCCC
op vA, vB, поле@CCCC
случай
22кс op vA, 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@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, введите @BBBB

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

3среднеквадр. op {vCCCC .. vNNNN}, vtaboff@BBBB

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

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

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

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

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

вызвать-полиморфный/диапазон
АА| оп BBBB ло BBBB BBBB BBBB привет 51л op ваа, #+BBBBBBBBBBBBBBBB константный