1

という名前の Java クラスを定義しましたDefineFields。空のコンストラクターがあります。コンパイルすると、classes.dexファイル内の 16 進コードは次のように表示されます。

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 は仕様で説明テーブルを持っています。) さらに知りたいのは、と の1016 進数をどのように説明できるかです。70100C050C

これらは仕様のオペコードと一致しません。

4

1 に答える 1

5

質問の 2 番目の部分に答えるために、「35c」、「22x」、「10x」などの値は命令形式を指します。これにより、命令のサイズと、命令のさまざまな部分がこの空間にどのように詰め込まれるかが決まります。これらは、命令形式ドキュメントで定義されています。

指定された命令を誤って「解析」しています。命令の長さは必ずしも 2 バイトではありません。これは実際には 2 命令のエンコードです。オペコードが 0x70 の最初の命令は、invoke-direct 命令で、フォーマットは 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 バイトです。この命令の 16 進値は次のとおりです。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 の値が渡されます。

2 番目の命令0E00のオペコードは 0E で、これは return-void で、10x のフォーマットです。

ØØ|op

これは簡単にデコードできます。オペコード以外の情報は含まれていません。

于 2012-10-26T16:43:26.757 に答える