На этой странице перечислены форматы инструкций, используемые форматом исполняемого файла 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, #+BBBB0000op vAA, #+BBBB000000000000 | ||
21с | op vAA, тип@BBBBop vAA, поле@BBBBop vAA, method_handle@BBBBop vAA, прото@BBBBop 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, тип@CCCCop 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@BBBBop {vCCCC .. vNNNN}, сайт@BBBBop {vCCCC .. vNNNN}, type@BBBB где | |
3 среднеквадратичного значения | op {vCCCC .. vNNNN}, vtaboff@BBBB где | предлагаемый формат для статически связанных инструкций invoke-virtual и invoke-super формата 3rc | |
3рми | op {vCCCC .. vNNNN}, inline@BBBB где | предлагаемый формат для встроенных инструкций 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 где | вызывать-полиморфный/диапазон |
АА| op BBBB lo BBBB BBBB BBBB привет | 51л | op vAA, #+BBBBBBBBBBBBBBBB | const-wide |