1

我定义了一个名为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 在规范中有解释表。)我想知道的是如何解释 the和 中的10十六进制70100C050C

这些东西与规范操作码不匹配。

4

1 回答 1

5

要回答您问题的第二部分,“35c”、“22x”、“10x”等值是指指令格式。这决定了指令的大小,以及指令的各个部分如何被打包到这个空间中。这些在指令格式文档中定义。

您正在错误地“解析”给定的指令。指令的长度并不总是 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 包含被调用方法的方法索引。这指的是该特定索引处的 dex 文件中的 method_id_item。它被传递了一个参数,即寄存器 v0 中的值。

第二条指令0E00的操作码为0E,即return-void,格式为10x。

ØØ|op

这个很容易解码。它不包含除操作码以外的任何其他信息。

于 2012-10-26T16:43:26.757 回答