Formati di istruzioni eseguibili Dalvik

Questa pagina elenca i formati di istruzioni utilizzati dal formato eseguibile Dalvik (DEX) e dal bytecode Dalvik. È pensato per essere utilizzato insieme al documento di riferimento del bytecode .

Descrizioni bit a bit

La prima colonna nella tabella del formato elenca il layout bit a bit del formato. È costituito da una o più "parole" separate da spazi, ciascuna delle quali descrive un'unità di codice a 16 bit. Ogni carattere in una parola rappresenta quattro bit, letti dai bit più alti a quelli più bassi, con barre verticali (" | ") intervallate per facilitare la lettura. Le lettere maiuscole in sequenza dalla " A " vengono utilizzate per indicare i campi all'interno del formato (che vengono poi definiti ulteriormente dalla colonna della sintassi). Il termine " op " viene utilizzato per indicare la posizione di un codice operativo a otto bit all'interno del formato. Uno zero barrato (" Ø ") viene utilizzato per indicare che tutti i bit devono essere zero nella posizione indicata.

Per la maggior parte, i caratteri procedono dalle unità di codice precedenti alle unità di codice successive e dall'ordine inferiore a quello superiore all'interno di un'unità codice. Tuttavia, ci sono alcune eccezioni a questa regola generale, che vengono fatte per fare in modo che la denominazione di parti con significato simile sia la stessa nei diversi formati di istruzioni. Questi casi sono indicati esplicitamente nelle descrizioni del formato.

Ad esempio, il formato " B|A| op CCCC " indica che il formato è costituito da due unità di codice a 16 bit. La prima parola è costituita dal codice operativo negli otto bit bassi e da una coppia di valori a quattro bit negli otto bit alti; e la seconda parola è costituita da un singolo valore a 16 bit.

Formato ID

La seconda colonna nella tabella dei formati indica l'identificatore breve del formato, utilizzato in altri documenti e nel codice per identificare il formato.

La maggior parte degli ID formato sono costituiti da tre caratteri, due cifre seguite da una lettera. La prima cifra indica il numero di unità di codice a 16 bit nel formato. La seconda cifra indica il numero massimo di registri contenuti nel formato (massimo, poiché alcuni formati possono ospitare un numero variabile di registri), con la designazione speciale " r " che indica che è codificato un intervallo di registri. La lettera finale indica semi-mnemonicamente il tipo di eventuali dati aggiuntivi codificati dal formato. Ad esempio, il formato " 21t " ha lunghezza due, contiene un riferimento al registro e contiene inoltre una destinazione di diramazione.

I formati di collegamento statico suggeriti hanno un suffisso " s " aggiuntivo, per un totale di quattro caratteri. Allo stesso modo, i formati di collegamento "inline" suggeriti hanno un suffisso " i " aggiuntivo. (In questo contesto, il collegamento in linea è come il collegamento statico, tranne che con legami più diretti con l'implementazione di una macchina.) Infine, un paio di formati stravaganti suggeriti (ad esempio, " 20bc ") includono due pezzi di dati che sono entrambi rappresentati nel suo ID di formato .

L'elenco completo delle lettere del codice tipo è il seguente. Tieni presente che alcuni moduli hanno dimensioni diverse, a seconda del formato:

Mnemonico Dimensioni in bit Senso
B 8 firmato immediatamente da yte
C 16, 32 indice del pool costante
F 16 costanti di interfaccia (usate solo nei formati collegati staticamente)
H 16 immediato con segno h at (bit di ordine superiore di un valore a 32 o 64 bit; i bit di ordine inferiore sono tutti 0 )
io 32 immediato con segno int o float a 32 bit
l 64 immediato firmato lungo o doppio a 64 bit
M 16 costanti del metodo (utilizzate solo nei formati collegati staticamente)
N 4 bocconcino firmato immediato
S 16 breve firmato immediato
T 8, 16, 32 ramo t obiettivo
X 0 nessun dato aggiuntivo

Sintassi

La terza colonna della tabella dei formati indica la sintassi orientata all'uomo per le istruzioni che utilizzano il formato indicato. Ogni istruzione inizia con il codice operativo indicato ed è facoltativamente seguita da uno o più argomenti, a loro volta separati da virgole.

Ogni volta che un argomento si riferisce a un campo della prima colonna, nella sintassi è indicata la lettera corrispondente a quel campo, ripetuta una volta per ogni quattro bit del campo. Ad esempio, un campo a otto bit etichettato " BB " nella prima colonna verrebbe etichettato anche " BB " nella colonna della sintassi.

Gli argomenti che nominano un registro hanno la forma " v X ". Il prefisso " v " è stato scelto al posto del più comune " r " proprio per evitare conflitti con le architetture (non virtuali) su cui potrebbe essere implementato il formato Dalvik Executable che utilizzano a loro volta il prefisso " r " per i loro registri. (Cioè, questa decisione rende possibile parlare insieme sia dei registri virtuali che di quelli reali senza bisogno di circonlocuzioni.)

Gli argomenti che indicano un valore letterale hanno la forma " #+ X ". Alcuni formati indicano valori letterali che hanno solo bit diversi da zero nei bit di ordine superiore; per questi, gli zeri sono rappresentati esplicitamente nella sintassi, anche se non compaiono nella rappresentazione bit a bit.

Gli argomenti che indicano un offset relativo dell'indirizzo dell'istruzione hanno la forma " + X ".

Gli argomenti che indicano un indice di pool costante letterale hanno la forma " kind @ X ", dove " kind " indica a quale pool costante si fa riferimento. Ogni codice operativo che utilizza tale formato consente esplicitamente solo un tipo di costante; vedere il riferimento al codice operativo per capire la corrispondenza. I tipi di pool costante sono " string " (indice del pool di stringhe), " type " (indice del pool di tipi), " field " (indice del pool di campi), " meth " (indice del pool di metodi) e " site " (indice del pool di chiamate ).

Analogamente alla rappresentazione degli indici del pool costante, sono disponibili anche forme suggerite (facoltative) che indicano offset o indici precollegati. Esistono due tipi di valori precollegati suggeriti: offset vtable (indicati come " vtaboff ") e offset campo (indicati come " fieldoff ").

Nei casi in cui un valore di formato non è esplicitamente parte della sintassi ma sceglie invece una variante, ciascuna variante è elencata con il prefisso " [ X = N ] " (ad esempio, " [A=2] ") per indicare la corrispondenza .

Formati

Formato ID Sintassi Codici operativi notevoli coperti
N / A 00x N/A pseudo-formato utilizzato per codici operativi non utilizzati; suggerito per l'uso come formato nominale per un codice operativo del punto di interruzione
ØØ| operazione 10x op
B|A| operazione 12x op vA, vB
11n op vA, #+B
AA| operazione 11x op vAA
10t op +AA vai a
ØØ| su AAAA 20 t op +AAAA vai a/16
AA| su BBBB 20 a.C op AA, gentile@BBBB formato suggerito per errori di verifica determinati staticamente; A è il tipo di errore e B è un indice in una tabella appropriata al tipo (ad esempio riferimenti al metodo per un errore di metodo senza tale metodo)
AA| su BBBB 22x op vAA, vBBBB
21t op vAA, +BBBB
21s op vAA, #+BBBB
21h op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
21c op vAA, digitare@BBBB
op vAA, campo@BBBB
op vAA, metodo_handle@BBBB
op vAA, proto@BBBB
op vAA, stringa@BBBB
check-cast
classe const
const-metodo-handle
tipo-metodo const
const-string
AA| su CC|BB 23x op vAA, vBB, vCC
22b op vAA, vBB, #+CC
B|A| su CCCC 22t op vA, vB, +CCCC
22 secondi op vA, vB, #+CCCC
22c op vA, vB, digitare@CCCC
op vA, vB, campo@CCCC
istanza di
22cs op vA, vB, fieldoff@CCCC formato suggerito per le istruzioni di accesso al campo collegate staticamente del formato 22c
ØØ| op AAAA lo AAAA ciao 30 t op +AAAAAAAA vai a/32
ØØ| su AAAA BBBB 32x op vAAAA, vBBBB
AA| op BBBB lo BBBB ciao 31i op vAA, #+BBBBBBBB
31t op vAA, +BBBBBBBB
31c op vAA, stringa@BBBBBBBB const-string/jumbo
A|G| op SIBB FA|MI|RE|DO 35c [ A=5 ] op {vC, vD, vE, vF, vG}, meth@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, sito@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, tipo@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

La scelta insolita dei caratteri qui riflette la volontà di contare e l'indice di riferimento ha la stessa etichetta del formato 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

La scelta insolita del lettering qui riflette il desiderio di contare e l'indice di riferimento ha la stessa etichetta del formato 3rms.

formato suggerito per le istruzioni invoke-virtual e invoke-super collegate staticamente in formato 35c
35 miglia [ 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

La scelta insolita del lettering qui riflette la volontà di contare e l'indice di riferimento ha la stessa etichetta del formato 3rmi.

formato suggerito per le istruzioni invoke-static e invoke-virtual collegate in linea del formato 35c
AA| su BBBB CCCC 3rc op {vCCCC .. vNNNN}, meth@BBBB
op {vCCCC .. vNNNN}, sito@BBBB
op {vCCCC .. vNNNN}, digitare@BBBB

dove NNNN = CCCC+AA-1 , ovvero A determina il conteggio 0..255 e C determina il primo registro

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

dove NNNN = CCCC+AA-1 , ovvero A determina il conteggio 0..255 e C determina il primo registro

formato suggerito per le istruzioni invoke-virtual e invoke-super collegate staticamente in formato 3rc
3mi op {vCCCC .. vNNNN}, inline@BBBB

dove NNNN = CCCC+AA-1 , ovvero A determina il conteggio 0..255 e C determina il primo registro

formato suggerito per le istruzioni invoke-static e invoke-virtual collegate in linea del formato 3rc
A|G| op SIBB FA|MI|RE|DO 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
invocare-polimorfico
AA| su BBBB CCCC HHHH 4cc op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH

dove NNNN = CCCC+AA-1 , ovvero A determina il conteggio 0..255 e C determina il primo registro

invoca-polimorfico/intervallo
AA| op BBBB lo BBBB BBBB BBBB hi 51l op vAA, #+BBBBBBBBBBBBBBBB const-wide