Dalvik 実行可能命令フォーマット

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このページでは、Dalvik Executable 形式と Dalvik バイトコードで使用される命令形式を一覧表示します。これは、バイトコード リファレンス ドキュメントと組み合わせて使用​​することを意図しています。

ビット単位の説明

フォーマット テーブルの最初の列には、フォーマットのビット単位のレイアウトが一覧表示されます。これは、スペースで区切られた 1 つ以上の「単語」で構成され、それぞれが 16 ビットのコード単位を表します。ワードの各文字は 4 ビットを表し、上位ビットから下位ビットの順に読み取られ、読みやすいように縦棒 (" | ") が散在しています。 " A " から順に大文字を使用して、フォーマット内のフィールドを示します (その後、構文列によってさらに定義されます)。 「 op 」という用語は、フォーマット内の 8 ビット オペコードの位置を示すために使用されます。スラッシュ ゼロ (" Ø ") は、指定された位置ですべてのビットがゼロでなければならないことを示すために使用されます。

ほとんどの場合、レタリングは前のコード単位から後のコード単位へと進み、コード単位内で下位から上位へと進みます。ただし、この一般規則にはいくつかの例外があり、類似した意味を持つ部分の命名を異なる命令フォーマット間で同じにするために行われます。これらのケースは、フォーマットの説明に明示的に記載されています。

たとえば、「 B|A| op CCCC 」という形式は、その形式が 2 つの 16 ビット コード ユニットで構成されていることを示します。最初のワードは、下位 8 ビットのオペコードと、上位 8 ビットの 4 ビット値のペアで構成されます。 2 番目のワードは、単一の 16 ビット値で構成されます。

フォーマット ID

形式テーブルの 2 列目は、形式を識別するために他のドキュメントやコードで使用される、形式の短い識別子を示します。

ほとんどの形式 ID は、2 桁の数字の後に文字が続く 3 文字で構成されます。最初の桁は、フォーマット内の 16 ビット コード単位の数を示します。 2 桁目は、フォーマットに含まれるレジスタの最大数を示し (一部のフォーマットでは可変数のレジスタに対応できるため、最大)、特別な指定 " r " は、レジスタの範囲がエンコードされていることを示します。最後の文字は、形式によってエンコードされた追加データのタイプを半記憶的に示します。たとえば、フォーマット " 21t " は長さ 2 で、1 つのレジスタ参照を含み、さらに分岐ターゲットを含みます。

推奨される静的リンク形式には、追加の「 s 」サフィックスがあり、合計 4 文字になります。同様に、推奨される「インライン」リンク形式には、追加の「 i 」サフィックスがあります。 (このコンテキストでは、インライン リンクは静的リンクに似ていますが、マシンの実装により直接的な関係がある点が異なります。) 最後に、いくつかの奇妙な形式 (" 20bc " など) には、形式 ID で表される 2 つのデータが含まれています。 .

タイプコード文字の完全なリストは次のとおりです。一部のフォームは、形式によってサイズが異なることに注意してください。

ニモニックビットサイズ意味
b 8即時署名バイト
c 16、32コンスタントプール インデックス
16インターフェイス定数(静的にリンクされた形式でのみ使用)
時間16即時の符号付きh at (32 ビットまたは 64 ビット値の上位ビット。下位ビットはすべて0 )
32即時符号付きi nt、または 32 ビット浮動小数点数
l 64即時の符号付きlong、または 64 ビット double
メートル16メソッド定数 (静的にリンクされた形式でのみ使用)
n 4即時署名ニブル
s 16即時署名ショート
t 8、16、32分岐
バツ0追加データなし

構文

フォーマット表の 3 列目は、指定されたフォーマットを使用する命令の人間向けの構文を示しています。各命令は、指定されたオペコードで始まり、オプションで 1 つ以上の引数が続きます。引数自体はコンマで区切られています。

引数が最初の列のフィールドを参照する場合は常に、そのフィールドの文字が構文で示され、フィールドの 4 ビットごとに 1 回繰り返されます。たとえば、最初の列で「 BB 」とラベル付けされた 8 ビット フィールドは、構文列でも「 BB 」とラベル付けされます。

レジスタを指定する引数の形式は " v X " です。プレフィックス「 v 」は、より一般的な「 r 」の代わりに正確に選択され、Dalvik Executable フォーマットが実装されている可能性がある (非仮想) アーキテクチャで、レジスタにプレフィックス「 r 」を使用している場合との競合を回避します。 (つまり、この決定により、仮想レジスターと実レジスターの両方について、迂回する必要なく一緒に話すことが可能になります。)

リテラル値を示す引数の形式は " #+ X " です。一部の形式は、上位ビットにゼロ以外のビットのみを持つリテラルを示します。これらのゼロは、ビット単位の表現には表示されませんが、構文では明示的に表現されます。

相対命令アドレス オフセットを示す引数の形式は " + X " です。

リテラル定数プール インデックスを示す引数は、" kind @ X " の形式を持ちます。ここで、" kind " は、どの定数プールが参照されているかを示します。このような形式を明示的に使用する各オペコードは、1 種類の定数のみを許可します。対応を把握するには、オペコードのリファレンスを参照してください。定数プールの種類は、" string " (文字列プール インデックス)、" type " (型プール インデックス)、" field " (フィールド プール インデックス)、" meth " (メソッド プール インデックス)、および " site " (呼び出しサイト インデックス) です。 )。

定数プール インデックスの表現と同様に、事前にリンクされたオフセットまたはインデックスを示す推奨される (オプションの) 形式もあります。推奨されるプレリンク値には、vtable オフセット (「 vtaboff 」として示される) とフィールド オフセット (「 fieldoff 」として示される) の 2 つのタイプがあります。

フォーマット値が明示的に構文の一部ではなく、代わりにバリアントを選択する場合、対応を示すために、各バリアントは接頭辞 " [ X = N ] " (たとえば、" [A=2] ") とともにリストされます。 .

フォーマット

フォーマットID構文対象となる注目すべきオペコード
なし00x N/A未使用のオペコードに使用される疑似フォーマット。ブレークポイント オペコードの公称形式として使用することをお勧めします
ØØ| op 10倍op
B|A| op 12倍op vA、vB
11n op vA、#+B
AA| op 11倍op vAA
10t op +AA後藤
ØØ| op AAAA 20t op +AAAA goto/16
AA| op BBBB紀元前20年op AA, kind@BBBB静的に決定された検証エラーの推奨形式。 A はエラーのタイプで、B はタイプに適したテーブルへのインデックスです (たとえば、no- such-method エラーのメソッド参照)。
AA| op BBBB 22倍op vAA、vBBBB
21t op vAA、+BBBB
21代op vAA、#+BBBB
21h op vAA、#+BBBB0000
op vAA、#+BBBB000000000000
21c op vAA、type@BBBB
op vAA、field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op vAA、string@BBBB
チェックキャスト
const クラス
const メソッド ハンドル
const メソッド型
const-string
AA| op CC|BB 23倍op vAA、vBB、vCC
22b op vAA、vBB、#+CC
B|A| op CCCC 22t op vA、vB、+CCCC
22代op vA、vB、#+CCCC
22c op vA、vB、type@CCCC
op vA、vB、field@CCCC
インスタンスの
22cs op vA、vB、fieldoff@CCCC形式 22c の静的にリンクされたフィールド アクセス命令の推奨形式
ØØ| op AAAAAAAAハイ30t op +AAAAAAAAA goto/32
ØØ| op AAAA BBBB 32倍op vAAAA、vBBBB
AA| op BBBBBBBBハイ31i op vAA、#+BBBBBBBB
31t op vAA、+BBBBBBBB
31c op vAA, string@BBBBBBBB const-string/ジャンボ
A|G| op BBBB F|E|D|C 35c [ A=5 ] op {vC, vD, vE, vF, vG}, meth@BBBB
[ A=5 ] op {vC、vD、vE、vF、vG}、site@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

ここでのレタリングの珍しい選択は、カウントと参照インデックスにフォーマット 3rc と同じラベルを持たせたいという願望を反映しています。

35ms [ A=5 ] op {vC, vD, vE, vF, vG}, vtaboff@BBBB
[ A=4 ] op {vC, vD, vE, vF}, vtaboff@BBBB
[ A=3 ] op {vC, vD, vE}, vtaboff@BBBB
[ A=2 ] op {vC, vD}, vtaboff@BBBB
[ A=1 ] op {vC}, vtaboff@BBBB

ここでのレタリングの珍しい選択は、カウントと参照インデックスにフォーマット 3rms と同じラベルを付けたいという願望を反映しています。

形式 35c の静的にリンクされたinvoke-virtualおよびinvoke-super命令の推奨形式
35マイル[ A=5 ] op {vC, vD, vE, vF, vG}, inline@BBBB
[ A=4 ] op {vC, vD, vE, vF}, inline@BBBB
[ A=3 ] op {vC, vD, vE}, inline@BBBB
[ A=2 ] op {vC, vD}, inline@BBBB
[ A=1 ] op {vC}, inline@BBBB

ここでのレタリングの珍しい選択は、カウントと参照インデックスにフォーマット 3rmi と同じラベルを持たせたいという願望を反映しています。

形式 35c のインラインでリンクされたinvoke-staticおよびinvoke-virtual命令の推奨形式
AA| op BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

ここで、 NNNN = CCCC+AA-1 、つまりAはカウント0..255を決定し、 Cは最初のレジスタを決定します

3rms op {vCCCC .. vNNNN}, vtaboff@BBBB

ここで、 NNNN = CCCC+AA-1 、つまりAはカウント0..255を決定し、 Cは最初のレジスタを決定します

形式3rcの静的にリンクされたinvoke-virtualおよびinvoke-super命令の推奨形式
3rmi op {vCCCC .. vNNNN}, inline@BBBB

ここで、 NNNN = CCCC+AA-1 、つまりAはカウント0..255を決定し、 Cは最初のレジスタを決定します

形式 3rc のインラインでリンクされたinvoke-staticおよびinvoke-virtual命令の推奨形式
A|G| op BBBB F|E|D|C HHHH 45cc [ A=5 ] op {vC、vD、vE、vF、vG}、meth@BBBB、proto@HHHH
[ A=4 ] op {vC、vD、vE、vF}、meth@BBBB、proto@HHHH
[ A=3 ] op {vC, vD, vE}, meth@BBBB, proto@HHHH
[ A=2 ] op {vC, vD}, meth@BBBB, proto@HHHH
[ A=1 ] op {vC}, meth@BBBB, proto@HHHH
インボーク・ポリモーフィック
AA| op BBBB CCCC HHHH 4rcc op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH

ここで、 NNNN = CCCC+AA-1 、つまりAはカウント0..255を決定し、 Cは最初のレジスタを決定します

インボークポリモーフィック/範囲
AA| op BBBBBBBB BBBB BBBBハイ51リットルop vAA、#+BBBBBBBBBBBBBBBB定数全体