Путать среди кода smali и спецификации байт-кода dalvik и реального шестнадцатеричного кода операции в файле dex

Я определил класс Java с именем DefineFields. У него пустой конструктор. Когда я его компилирую, шестнадцатеричный код в файле classes.dex выглядит так:

7010 050C 0000 0E00 (show in little endian)

после этого я ищу спецификацию байт-кода и нашел ее

(spec code)                      (hex of dex) 
  70 35c: invoke-direct           (7010)     
  05 22x: move-wide/from16        (050C)
  00 10x: nop                     (0000)
  0E 10x: return-void             (0E00)

Я прочитал спецификацию. Но я не могу полностью понять, что такое 35c. (Я знаю, что c, x имеют таблицу объяснений в спецификации.) Более того, я хочу знать, как я могу объяснить шестнадцатеричный код 10 в 7010 и 0C в 050C.

Эти вещи не соответствуют коду операции спецификации.


person QianBin Piao    schedule 26.10.2012    source источник


Ответы (1)


Чтобы ответить на вторую часть вашего вопроса, такие значения, как «35c», «22x», «10x», относятся к формату инструкции. Это определяет размер инструкции и то, как различные части инструкции упакованы в это пространство. Они определены в документе instruction-formats.

Вы неправильно "разбираете" данную инструкцию. Инструкции не всегда имеют длину 2 байта. На самом деле это кодировка для 2-х инструкций. Первая инструкция с кодом операции 0x70 является инструкцией прямого вызова и имеет формат 35c.

Макет инструкции 35c приведен в документе форматов инструкций.

A|G|op BBBB F|E|D|C

[A=5] op {vC, vD, vE, vF, vG}, meth@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

Это инструкция из 3 единиц, где каждая единица занимает 2 байта. Всего 6 байт. Шестнадцатеричные значения для этой инструкции: 7010 050C 0000

Обратите внимание, что каждая «группа» из 2 байтов отображается так, как если бы она была в обратном порядке. Итак, для «7010 050C 0000» значение каждой «буквы» будет:

7010 050C 0000
OOAG BBBB DCFE

OP = 0x70 
A = 1
G = 0
B = 0x0C05
C = 0
D = 0
E = 0
F = 0

Из формата видно, что значение A определяет количество аргументов, которые передаются методу. В этом случае A имеет значение 1, поэтому применимая строка

[A=1] op {vC}, kind@BBBB

Таким образом, B содержит индекс вызываемого метода. Это относится к method_id_item в файле dex по этому конкретному индексу. И ему передается единственный аргумент, значение в регистре v0.

Для 2-й инструкции 0E00 код операции равен 0E, что означает return-void, с форматом 10x.

ØØ|op

Это легко расшифровать. Он не содержит никакой другой информации, кроме кода операции.

person JesusFreke    schedule 26.10.2012
comment
Большое спасибо. Когда я прочитал ваше объяснение, я многому научился. Спасибо еще раз - person QianBin Piao; 27.10.2012