Ausführbare Befehlsformate von Dalvik

Auf dieser Seite werden die Befehlsformate aufgeführt, die vom Dalvik Executable (DEX)-Format und dem Dalvik-Bytecode verwendet werden. Es soll in Verbindung mit dem Bytecode-Referenzdokument verwendet werden.

Bitweise Beschreibungen

Die erste Spalte in der Formattabelle listet das bitweise Layout des Formats auf. Es besteht aus einem oder mehreren durch Leerzeichen getrennten „Wörtern“, von denen jedes eine 16-Bit-Codeeinheit beschreibt. Jedes Zeichen in einem Wort stellt vier Bits dar, die von den hohen bis zu den niedrigen Bits gelesen werden, mit dazwischen liegenden vertikalen Balken („ | “), die das Lesen erleichtern. Großbuchstaben in der Reihenfolge „ A “ werden verwendet, um Felder innerhalb des Formats anzuzeigen (die dann durch die Syntaxspalte weiter definiert werden). Der Begriff „ op “ wird verwendet, um die Position eines 8-Bit-Opcodes innerhalb des Formats anzugeben. Eine durchgestrichene Null („ Ø “) wird verwendet, um anzuzeigen, dass alle Bits an der angegebenen Position Null sein müssen.

Größtenteils verläuft die Beschriftung von früheren Codeeinheiten zu späteren Codeeinheiten und innerhalb einer Codeeinheit von niedriger zu höherer Ordnung. Es gibt jedoch einige Ausnahmen von dieser allgemeinen Regel, die vorgenommen werden, um die Benennung von Teilen mit ähnlicher Bedeutung in verschiedenen Befehlsformaten gleich zu gestalten. Auf diese Fälle wird in den Formatbeschreibungen explizit hingewiesen.

Das Format „ B|A| op CCCC “ gibt beispielsweise an, dass das Format aus zwei 16-Bit-Codeeinheiten besteht. Das erste Wort besteht aus dem Opcode in den unteren acht Bits und einem Paar von Vier-Bit-Werten in den oberen acht Bits; und das zweite Wort besteht aus einem einzelnen 16-Bit-Wert.

Format-IDs

Die zweite Spalte in der Formattabelle gibt die Kurzkennung für das Format an, die in anderen Dokumenten und im Code zur Identifizierung des Formats verwendet wird.

Die meisten Format-IDs bestehen aus drei Zeichen, zwei Ziffern gefolgt von einem Buchstaben. Die erste Ziffer gibt die Anzahl der 16-Bit-Codeeinheiten im Format an. Die zweite Ziffer gibt die maximale Anzahl von Registern an, die das Format enthält (maximal, da einige Formate eine variable Anzahl von Registern aufnehmen können), wobei die spezielle Bezeichnung „ r “ angibt, dass ein Bereich von Registern codiert ist. Der letzte Buchstabe gibt halbmnemonisch den Typ aller zusätzlichen Daten an, die durch das Format codiert werden. Beispielsweise hat das Format „ 21t “ die Länge zwei, enthält eine Registerreferenz und zusätzlich ein Verzweigungsziel.

Vorgeschlagene statische Verknüpfungsformate haben ein zusätzliches „ s “-Suffix, sodass sie insgesamt vier Zeichen lang sind. Ebenso haben die vorgeschlagenen „Inline“-Verknüpfungsformate ein zusätzliches „ i “-Suffix. (In diesem Zusammenhang ähnelt die Inline-Verknüpfung der statischen Verknüpfung, außer dass sie direkter mit der Implementierung einer Maschine verknüpft ist.) Schließlich enthalten ein paar seltsame vorgeschlagene Formate (z. B. „ 20bc “) zwei Datenelemente, die beide in ihrer Format-ID dargestellt werden .

Die vollständige Liste der Typcode-Buchstaben lautet wie folgt. Beachten Sie, dass einige Formulare je nach Format unterschiedliche Größen haben:

Gedächtnisstütze Bitgrößen Bedeutung
B 8 Sofort signiertes Byte
C 16, 32 Konstanter Poolindex
F 16 Schnittstellenkonstanten (wird nur in statisch verknüpften Formaten verwendet)
H 16 unmittelbares vorzeichenbehaftetes h at (höherwertige Bits eines 32- oder 64-Bit-Werts; niederwertige Bits sind alle 0 )
ich 32 sofortiger signierter Wert oder 32-Bit-Float
l 64 sofort signiert lang oder 64-Bit-Double
M 16 Methodenkonstanten (wird nur in statisch verknüpften Formaten verwendet)
N 4 sofort signiertes Knabberzeug
S 16 sofort unterschrieben
T 8, 16, 32 Zweigziel
X 0 keine zusätzlichen Daten

Syntax

Die dritte Spalte der Formattabelle gibt die menschengerechte Syntax für Anweisungen an, die das angegebene Format verwenden. Jede Anweisung beginnt mit dem benannten Opcode und wird optional von einem oder mehreren Argumenten gefolgt, die wiederum durch Kommas getrennt sind.

Wo immer sich ein Argument auf ein Feld aus der ersten Spalte bezieht, wird der Buchstabe für dieses Feld in der Syntax angegeben und einmal für jeweils vier Bits des Felds wiederholt. Beispielsweise würde ein 8-Bit-Feld mit der Bezeichnung „ BB “ in der ersten Spalte auch die Bezeichnung „ BB “ in der Syntaxspalte tragen.

Argumente, die ein Register benennen, haben die Form „ v X “. Das Präfix „ v “ wurde anstelle des gebräuchlicheren „ r “ gewählt, genau um Konflikte mit (nicht virtuellen) Architekturen zu vermeiden, auf denen das Dalvik Executable-Format implementiert werden könnte, die selbst das Präfix „ r “ für ihre Register verwenden. (Das heißt, diese Entscheidung ermöglicht es, sowohl über virtuelle als auch über reale Register gleichzeitig zu sprechen, ohne dass Umschweifungen erforderlich sind.)

Argumente, die einen Literalwert angeben, haben die Form „ #+ X “. Einige Formate geben Literale an, deren höherwertige Bits nur Bits ungleich Null enthalten. für diese werden die Nullen explizit in der Syntax dargestellt, auch wenn sie in der bitweisen Darstellung nicht erscheinen.

Argumente, die einen relativen Befehlsadressenoffset angeben, haben die Form „ + X “.

Argumente, die einen Literal-Konstantenpoolindex angeben, haben die Form „ kind @ X “, wobei „ kind “ angibt, auf welchen Konstantenpool verwiesen wird. Jeder Opcode, der ein solches Format verwendet, erlaubt explizit nur eine Art von Konstante; Sehen Sie sich die Opcode-Referenz an, um die Entsprechung herauszufinden. Die Arten von Konstantenpools sind „ string “ (String-Pool-Index), „ type “ (Typ-Pool-Index), „ field “ (Feld-Pool-Index), „ meth “ (Methoden-Pool-Index) und „ site “ (Aufruf-Site-Index). ).

Ähnlich wie bei der Darstellung konstanter Pool-Indizes gibt es auch vorgeschlagene (optionale) Formen, die vorverknüpfte Offsets oder Indizes angeben. Es gibt zwei Arten von vorgeschlagenen vorverknüpften Werten: Vtable-Offsets (angezeigt als „ vtaboff “) und Feldoffsets (angezeigt als „ fieldoff “).

In den Fällen, in denen ein Formatwert nicht explizit Teil der Syntax ist, sondern stattdessen eine Variante auswählt, wird jede Variante mit dem Präfix „ [ X = N ] “ (z. B. „ [A=2] “) aufgeführt, um die Entsprechung anzuzeigen .

Formate

Format AUSWEIS Syntax Bemerkenswerte Opcodes werden abgedeckt
N / A 00x N/A Pseudoformat, das für nicht verwendete Opcodes verwendet wird; Empfohlen zur Verwendung als Nominalformat für einen Haltepunkt-Opcode
ØØ| op 10x op
B|A| op 12x op vA, vB
11n op vA, #+B
AA| op 11x op vAA
10t op +AA gehe zu
ØØ| auf AAAA 20t op +AAAA gehe zu/16
AA| auf BBBB 20 v. Chr op AA, kind@BBBB vorgeschlagenes Format für statisch ermittelte Verifizierungsfehler; A ist die Art des Fehlers und B ist ein Index in eine typgerechte Tabelle (z. B. Methodenreferenzen für einen Fehler, bei dem es keine solche Methode gibt).
AA| auf BBBB 22x op vAA, vBBBB
21t op vAA, +BBBB
21er Jahre op vAA, #+BBBB
21 Uhr op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
21c op vAA, Typ@BBBB
op vAA, field@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op vAA, string@BBBB
Check-Cast
const-Klasse
const-method-handle
const-method-type
const-string
AA| auf CC|BB 23x op vAA, vBB, vCC
22b op vAA, vBB, #+CC
B|A| op CCCC 22t op vA, vB, +CCCC
22s op vA, vB, #+CCCC
22c op vA, vB, type@CCCC
op vA, vB, field@CCCC
Instanz von
22cs op vA, vB, fieldoff@CCCC Empfohlenes Format für statisch verknüpfte Feldzugriffsanweisungen im Format 22c
ØØ| op AAAA lo AAAA hallo 30t op +AAAAAAAA gehe zu/32
ØØ| auf AAAA BBBB 32x op vAAAA, vBBBB
AA| op BBBB lo BBBB hi 31i op vAA, #+BBBBBBBB
31t op vAA, +BBBBBBBB
31c op vAA, string@BBBBBBBB const-string/jumbo
A|G| auf 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}, Typ@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

Die ungewöhnliche Wahl der Beschriftung spiegelt hier den Wunsch wider, die Zählung und den Referenzindex mit der gleichen Beschriftung wie im Format 3rc zu versehen.

35 ms [ 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

Die ungewöhnliche Wahl der Beschriftung spiegelt hier den Wunsch wider, die Zählung und den Referenzindex mit der gleichen Beschriftung wie im Format 3rms zu versehen.

Empfohlenes Format für statisch verknüpfte invoke-virtual und invoke-super Anweisungen im Format 35c
56 km [ 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

Die ungewöhnliche Wahl der Beschriftung spiegelt hier den Wunsch wider, die Zählung und den Referenzindex mit der gleichen Beschriftung wie im Format 3rmi zu versehen.

Empfohlenes Format für inline verknüpfte invoke-static und invoke-virtual Anweisungen im Format 35c
AA| auf BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, Typ@BBBB

wobei NNNN = CCCC+AA-1 , das heißt A bestimmt die Anzahl 0..255 und C bestimmt das erste Register

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

wobei NNNN = CCCC+AA-1 , das heißt A bestimmt die Anzahl 0..255 und C bestimmt das erste Register

Empfohlenes Format für statisch verknüpfte invoke-virtual und invoke-super Anweisungen im Format 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

wobei NNNN = CCCC+AA-1 , das heißt A bestimmt die Anzahl 0..255 und C bestimmt das erste Register

Empfohlenes Format für inline-verknüpfte invoke-static und invoke-virtual Anweisungen im Format 3rc
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
invoke-polymorphic
AA| auf BBBB CCCC HHHH 4rcc op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH

wobei NNNN = CCCC+AA-1 , das heißt A bestimmt die Anzahl 0..255 und C bestimmt das erste Register

invoke-polymorphic/range
AA| op BBBB lo BBBB BBBB BBBB hi 51l op vAA, #+BBBBBBBBBBBBBBBB const-weit