Чтобы ответить на вторую часть вашего вопроса, такие значения, как «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