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

На этой странице перечислены форматы инструкций, используемые форматом исполняемого файла Dalvik и байт-кодом Dalvik. Он предназначен для использования в сочетании со справочным документом по байт -коду.

Побитовые описания

В первом столбце таблицы форматов указана побитовая структура формата. Он состоит из одного или нескольких «слов», разделенных пробелами, каждое из которых описывает 16-битную кодовую единицу. Каждый символ в слове представляет собой четыре бита, читаемых от старших битов к младшим, с вертикальными чертами (" | "), перемежающимися для облегчения чтения. Буквы верхнего регистра в последовательности от « A » используются для обозначения полей в формате (которые затем определяются столбцом синтаксиса). Термин « op » используется для обозначения позиции восьмибитного кода операции в формате. Ноль с косой чертой (« Ø ») используется для указания того, что все биты должны быть равны нулю в указанной позиции.

По большей части надписи переходят от более ранних кодовых единиц к более поздним кодовым единицам и от младшего к старшему в кодовой единице. Однако есть несколько исключений из этого общего правила, которые сделаны для того, чтобы названия частей с одинаковым значением были одинаковыми в разных форматах инструкций. Эти случаи явно отмечены в описаниях форматов.

Например, формат « B|A| op CCCC » указывает, что формат состоит из двух 16-битных кодовых единиц. Первое слово состоит из кода операции в младших восьми битах и ​​пары четырехбитных значений в старших восьми битах; а второе слово состоит из одного 16-битного значения.

Идентификаторы форматов

Второй столбец в таблице форматов указывает короткий идентификатор формата, который используется в других документах и ​​в коде для идентификации формата.

Большинство идентификаторов формата состоят из трех символов, двух цифр и буквы. Первая цифра указывает количество 16-битных кодовых единиц в формате. Вторая цифра указывает максимальное количество регистров, которое содержит формат (максимальное, поскольку некоторые форматы могут вмещать переменное количество регистров), со специальным обозначением « r », указывающим, что кодируется диапазон регистров. Последняя буква полумнемонически указывает тип любых дополнительных данных, закодированных форматом. Например, формат " 21t " имеет длину два, содержит одну ссылку на регистр и дополнительно содержит цель перехода.

Предлагаемые форматы статических ссылок имеют дополнительный суффикс " s ", что делает их всего четырьмя символами. Точно так же предлагаемые «встроенные» форматы ссылок имеют дополнительный суффикс « i ». (В этом контексте встроенная компоновка похожа на статическую компоновку, за исключением более прямой связи с реализацией машины.) Наконец, пара предлагаемых странных форматов (например, « 20bc ») включает две части данных, которые оба представлены в своем идентификаторе формата. .

Полный список букв typecode выглядит следующим образом. Обратите внимание, что некоторые формы имеют разные размеры в зависимости от формата:

Мнемоника Размер бит Значение
б 8 непосредственный подписанный байт
с 16, 32 постоянный индекс пула
ф 16 константы интерфейса (используются только в статически связанных форматах)
час 16 непосредственный знак h at (старшие биты 32- или 64-битного значения; все младшие биты равны 0 )
я 32 немедленное число со знаком или 32- битное число с плавающей запятой
л 64 немедленное длинное со знаком или 64- битное двойное
м 16 константы методов (используются только в статически связанных форматах)
н 4 немедленно подписал n ibble
с 16 немедленная подписанная короткая
т 8, 16, 32 ветвь t цель
Икс 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] »), чтобы указать соответствие .

Форматы

Формат Я БЫ Синтаксис Охвачены известные коды операций
Н/Д 00x N/A псевдоформат, используемый для неиспользуемых кодов операций; предлагается для использования в качестве номинального формата кода операции точки останова
ØØ| оп 10x op
Б|А| оп 12x op vA, vB
11н op vA, #+B
АА| оп 11x op vAA
10т op +АА перейти к
ØØ| Оп АААА 20т op +AAAA перейти/16
АА| оп BBBB 20 г. до н.э. op АА, добрый @BBBB предлагаемый формат для статически определяемых ошибок проверки; A — это тип ошибки, а B — индекс в таблице соответствующего типа (например, ссылки на метод для ошибки, не связанной с таким методом).
АА| оп BBBB 22x op vAA, vBBBB
21т op vAA, +BBBB
21с op vAA, #+BBBB
21 час op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
21с op vAA, тип@BBBB
op vAA, поле@BBBB
op vAA, method_handle@BBBB
op vAA, прото@BBBB
op vAA, строка@BBBB
контрольный бросок
const-класс
const-метод-дескриптор
const-метод-тип
константная строка
АА| Оп 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 +AAAAAAAA перейти/32
ØØ| оп AAAA BBBB 32x op вАААА, вВВВВ
АА| op BBBB lo BBBB привет 31i op vAA, #+BBBBBBBB
31т op vAA, +BBBBBBBB
31с op vAA, строка@BBBBBBBB константная строка/джамбо
А|Г| op 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}, встроенный @BBBB
[ A=3 ] op {vC, vD, vE}, встроенный @BBBB
[ A=2 ] op {vC, vD}, inline@BBBB
[ A=1 ] op {vC}, inline@BBBB

Необычный выбор шрифта здесь отражает желание сделать так, чтобы счет и справочный индекс имели ту же метку, что и в формате 3rmi.

предлагаемый формат для встроенных инструкций invoke-static и invoke-virtual формата 35c
АА| оп BBBB CCCC 3рк op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, сайт@BBBB
op {vCCCC .. vNNNN}, type@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
А|Г| op BBBB F|E|D|C HHHH 45 куб.см [ A=5 ] op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH
[ A=4 ] op {vC, vD, vE, vF}, meth@BBBB, прото@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
вызывать-полиморфный
АА| op BBBB CCCC HHHH 4ркк op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH

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

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