Format d'instructions exécutables Dalvik

Cette page liste les formats d'instructions utilisés par le format Dalvik Executable (DEX) et le bytecode Dalvik. Il est destiné à être utilisé avec le document de référence sur le bytecode.

Descriptions bit à bit

La première colonne du tableau des formats indique la mise en page au niveau du bit du format. Il se compose d'un ou plusieurs "mots" séparés par des espaces, chacun décrivant une unité de code de 16 bits. Chaque caractère d'un mot représente quatre bits, lus des bits les plus élevés aux bits les plus bas, avec des barres verticales ("|") intercalées pour faciliter la lecture. Les lettres majuscules en séquence à partir de "A" sont utilisées pour indiquer les champs du format (qui sont ensuite définis plus en détail par la colonne de syntaxe). Le terme "op" est utilisé pour indiquer la position d'un opcode de huit bits dans le format. Un zéro barré ("Ø") est utilisé pour indiquer que tous les bits doivent être à zéro à la position indiquée.

Dans la plupart des cas, l'ordre des lettres va des unités de code antérieures aux unités de code ultérieures, et de l'ordre inférieur à l'ordre supérieur au sein d'une unité de code. Cependant, il existe quelques exceptions à cette règle générale, qui sont appliquées afin que les noms des éléments ayant une signification similaire soient les mêmes dans les différents formats d'instructions. Ces cas sont indiqués explicitement dans les descriptions des formats.

Par exemple, le format "B|A|op CCCC" indique qu'il se compose de deux unités de code 16 bits. Le premier mot se compose de l'opcode dans les huit bits inférieurs et d'une paire de valeurs de quatre bits dans les huit bits supérieurs. Le deuxième mot se compose d'une seule valeur de 16 bits.

ID de format

La deuxième colonne du tableau des formats indique l'identifiant court du format, qui est utilisé dans d'autres documents et dans le code pour identifier le format.

La plupart des ID de format se composent de trois caractères, de deux chiffres suivis d'une lettre. Le premier chiffre indique le nombre d'unités de code 16 bits du format. Le deuxième chiffre indique le nombre maximal de registres que le format contient (maximum, car certains formats peuvent accueillir un nombre variable de registres), la désignation spéciale "r" indiquant qu'une plage de registres est encodée. La lettre finale indique de manière semi-mnémonique le type de données supplémentaires encodées par le format. Par exemple, le format "21t" a une longueur de deux, contient une référence de registre et contient également une cible de branche.

Les formats de liaison statique suggérés comportent un suffixe "s" supplémentaire, ce qui fait quatre caractères au total. De même, les formats de liaison "inline" suggérés comportent un suffixe "i" supplémentaire. (Dans ce contexte, l'association en ligne est semblable à l'association statique, sauf avec des liens plus directs dans l'implémentation d'une machine.) Enfin, quelques formats suggérés inhabituels (par exemple, "20bc") incluent deux éléments de données qui sont tous deux représentés dans son ID de format.

Voici la liste complète des lettres de typecode. Notez que certaines formes ont des tailles différentes, en fonction du format:

Éléments clés Tailles de bits Signification
b 8 octet signé immédiat
c 16, 32 Index de pool constant
f 16 constantes d'interface (utilisées uniquement dans les formats liés de manière statique)
h 16 hat signé immédiat (bits de poids fort d'une valeur de 32 ou 64 bits ; les bits de poids faible sont tous 0)
i 32 int signé immédiat ou float 32 bits
l 64 long signé immédiat ou double de 64 bits
m 16 Constantes de méthode (uniquement utilisées dans les formats liés de manière statique)
n 4 nibble signé immédiat
s 16 short signé immédiat
t 8, 16, 32 target de branche
x 0 aucune donnée supplémentaire

Syntaxe

La troisième colonne du tableau des formats indique la syntaxe lisible par l'humain pour les instructions qui utilisent le format indiqué. Chaque instruction commence par l'opcode nommé et peut être suivie d'un ou de plusieurs arguments, eux-mêmes séparés par des virgules.

Chaque fois qu'un argument fait référence à un champ de la première colonne, la lettre de ce champ est indiquée dans la syntaxe, répétée une fois pour chaque groupe de quatre bits du champ. Par exemple, un champ de huit bits libellé "BB" dans la première colonne est également libellé "BB" dans la colonne de syntaxe.

Les arguments qui nomment un registre ont la forme "vX". Le préfixe "v" a été choisi à la place du plus courant "r" précisément pour éviter tout conflit avec les architectures (non virtuelles) sur lesquelles le format Dalvik Executable peut être implémenté, qui utilisent elles-mêmes le préfixe "r" pour leurs registres. (En d'autres termes, cette décision permet de parler à la fois des registres virtuels et réels sans avoir à faire de détours.)

Les arguments qui indiquent une valeur littérale ont la forme "#+X". Certains formats indiquent des littéraux qui ne comportent que des bits non nuls dans leurs bits de poids élevé. Pour ces derniers, les zéros sont représentés explicitement dans la syntaxe, même s'ils n'apparaissent pas dans la représentation au niveau du bit.

Les arguments qui indiquent un décalage d'adresse d'instruction relatif ont la forme "+X".

Les arguments qui indiquent un index de pool de constantes littéral ont la forme "kind@X", où "kind" indique le pool de constantes auquel il fait référence. Chaque opcode qui utilise un tel format n'autorise explicitement qu'un seul type de constante. Consultez la référence des opcodes pour déterminer la correspondance. Les types de pool de constantes sont "string" (indice de pool de chaînes), "type" (indice de pool de types), "field" (indice de pool de champs), "meth" (indice de pool de méthodes) et "site" (indice de site d'appel).

Comme pour la représentation des indices du pool de constantes, des formes (facultatives) suggérées indiquent également des décalages ou des indices préliés. Il existe deux types de valeurs préliées suggérées: les décalages de table v (indiqués par "vtaboff") et les décalages de champ (indiqués par "fieldoff").

Dans les cas où une valeur de format ne fait pas explicitement partie de la syntaxe, mais sélectionne plutôt une variante, chaque variante est listée avec le préfixe "[X=N]" (par exemple, "[A=2]") pour indiquer la correspondance.

Formats

Format ID Syntaxe Opcodes notables couverts
N/A 00x N/A Pseudo-format utilisé pour les instructions de code non utilisées. Recommandé comme format nominal pour une instruction de code de point d'arrêt.
ØØ|op x10 op  
B|A|op 12 x op vA, vB  
11n op vA, #+B  
AA|op 11x op vAA  
10 t op +AA goto
ØØ|op AAAA 20 t op +AAAA goto/16
AA|op BBBB 20 b op AA, kind@BBBB Format suggéré pour les erreurs de validation déterminées de manière statique.A correspond au type d'erreur et B à un indice dans un tableau adapté au type (par exemple, des références de méthode pour une erreur de non-existence de méthode).
AA|op BBBB 22 x op vAA, vBBBB  
21t op vAA, +BBBB  
21 s 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
check-cast
const-class
const-method-handle
const-method-type
const-string
AA|op CC|BB 23 x op vAA, vBB, vCC  
22b op vAA, vBB, #+CC  
B|A|op CCCC 22t op vA, vB, +CCCC  
22 s op vA, vB, #+CCCC  
22c op vA, vB, type@CCCC
op vA, vB, field@CCCC
instance-of
22 cs op vA, vB, fieldoff@CCCC Format suggéré pour les instructions d'accès aux champs de format 22c liées de manière statique
ØØ|op AAAAlo AAAAhi 30 t op +AAAAAAAA goto/32
ØØ|op AAAA BBBB 32x op vAAAA, vBBBB  
AA|op BBBBlo BBBBhi 31i op vAA, #+BBBBBBBB  
31t op vAA, +BBBBBBBB  
31c op vAA, chaîne@BBBBBBBB const-string/jumbo
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

Le choix inhabituel de la typographie ici reflète le désir de donner au nombre et à l'indice de référence le même libellé que dans le format 3rc.

 
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

Le choix inhabituel de la typographie ici reflète le désir de donner au nombre et à l'indice de référence le même libellé que dans le format 3rms.

Format suggéré pour les instructions invoke-virtual et invoke-super liées de manière statique au 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

Le choix inhabituel de la typographie ici reflète le désir de donner au nombre et à l'indice de référence le même libellé que dans le format 3rmi.

Format suggéré pour les instructions invoke-static et invoke-virtual associées au format 35c
AA|op BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

NNNN = CCCC+AA-1, c'est-à-dire A, détermine le compte 0..255 et C détermine le premier registre

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

NNNN = CCCC+AA-1, c'est-à-dire A, détermine le compte 0..255 et C détermine le premier registre

Format suggéré pour les instructions invoke-virtual et invoke-super liées de manière statique au format 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

NNNN = CCCC+AA-1, c'est-à-dire A, détermine le compte 0..255 et C détermine le premier registre.

Format suggéré pour les instructions invoke-static et invoke-virtual associées au format 3rc
A|G|op BBBB F|E|D|C HHHH 45 cm³ [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|op BBBB CCCC HHHH 4rcc op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH

NNNN = CCCC+AA-1, c'est-à-dire A, détermine le compte 0..255 et C détermine le premier registre

invoke-polymorphic/range
AA|op BBBBlo BBBB BBBB BBBBhi 51 l op vAA, #+BBBBBBBBBBBBBBBB const-wide