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