このページでは、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、#+BBBB0000op vAA、#+BBBB000000000000 | ||
21c | op vAA、type@BBBBop vAA、field@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop 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@CCCCop vA、vB、field@CCCC | インスタンスの | |
22cs | op vA、vB、fieldoff@CCCC | 形式 22c の静的にリンクされたフィールド アクセス命令の推奨形式 | |
ØØ| op AAAAロAAAAハイ | 30t | op +AAAAAAAAA | goto/32 |
ØØ| op AAAA BBBB | 32倍 | op vAAAA、vBBBB | |
AA| op BBBBロBBBBハイ | 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@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBここで、 | |
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBBここで、 | 形式3rc の静的にリンクされたinvoke-virtual およびinvoke-super 命令の推奨形式 | |
3rmi | op {vCCCC .. vNNNN}, inline@BBBBここで、 | 形式 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ここで、 | インボークポリモーフィック/範囲 |
AA| op BBBBロBBBB BBBB BBBBハイ | 51リットル | op vAA、#+BBBBBBBBBBBBBBBB | 定数全体 |