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, #+BBBB0000op vAA, #+BBBB000000000000 | ||
21c | op vAA, Typ@BBBBop vAA, field@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop 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@CCCCop 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 @BBBBDie 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@BBBBDie 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@BBBBDie 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@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, Typ@BBBB wobei | |
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBB wobei | Empfohlenes Format für statisch verknüpfte invoke-virtual und invoke-super Anweisungen im Format 3rc | |
3rmi | op {vCCCC .. vNNNN}, inline@BBBB wobei | 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 | invoke-polymorphic/range |
AA| op BBBB lo BBBB BBBB BBBB hi | 51l | op vAA, #+BBBBBBBBBBBBBBBB | const-weit |