To answer the second part of your question, the values like "35c", "22x", "10x" refer to the instruction format. This determines the size of the instruction, and how the various parts of the instruction are packed into this space. These are defined in the instruction-formats document.
You are "parsing" the given instruction incorrectly. Instructions are not always 2 bytes in length. This is in fact the encoding for 2 instructions. The first instruction, with the opcode of 0x70, is the invoke-direct instruction, which has the format 35c.
The layout of a 35c instrucution is given in the instruction-formats document
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
This is a 3-unit instruction, where each unit is 2-bytes. So 6 bytes in total. The hex values for this instruction are 7010 050C 0000
Note that each "group" of 2 bytes is shown as if it were in big-endian order. So, for `7010 050C 0000', the value of each "letter" would be:
7010 050C 0000
OOAG BBBB DCFE
OP = 0x70
A = 1
G = 0
B = 0x0C05
C = 0
D = 0
E = 0
F = 0
You can see from the format that the value of A
determines the number of arguments that are passed to the method. In this case, A
has a value of 1, so the applicable line is
[A=1] op {vC}, kind@BBBB
So B contains the method index of the method that is called. This refers to the method_id_item in the dex file at that particular index. And it is being passed a single argument, the value in the register v0.
For the 2nd instruction 0E00
, the opcode is 0E, which is return-void, with a format of 10x.
ØØ|op
This one is easy to decode. It doesn't contain any other information other than the opcode.