Formati di istruzioni eseguibili Dalvik

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questa pagina elenca i formati di istruzione utilizzati dal formato eseguibile Dalvik 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 per bit del formato. Consiste in una o più "parole" separate da uno spazio, ciascuna delle quali descrive un'unità di codice a 16 bit. Ogni carattere in una parola rappresenta quattro bit, letti dai bit alti a quelli bassi, con barre verticali (" | ") intervallate per facilitare la lettura. Le lettere maiuscole in sequenza dalla " A " sono usate per indicare i campi all'interno del formato (che poi vengono ulteriormente definiti 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 da unità di codice precedenti a unità di codice successive e dall'ordine inferiore all'ordine superiore all'interno di un'unità di codice. Tuttavia, ci sono alcune eccezioni a questa regola generale, che sono fatte per fare in modo che la denominazione di parti con significato simile sia la stessa in diversi formati di istruzione. 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 dall'opcode negli otto bit bassi e da una coppia di valori a quattro bit negli otto bit alti; e la seconda parola consiste in un unico valore a 16 bit.

Formato ID

La seconda colonna nella tabella di formato indica l'identificatore breve per il formato, che viene utilizzato in altri documenti e nel codice per identificare il formato.

La maggior parte degli ID formato è composta 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 che il formato contiene (massimo, poiché alcuni formati possono ospitare un numero variabile di registri), con la designazione speciale " r " che indica che un intervallo di registri è codificato. La lettera finale indica semi-mnemonicamente il tipo di eventuali dati extra codificati dal formato. Ad esempio, il formato " 21t " è di lunghezza due, contiene un riferimento di registro e contiene inoltre un target di diramazione.

I formati di collegamento statici suggeriti hanno un suffisso " s " aggiuntivo, che li rende di quattro caratteri in totale. 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 collegamenti più diretti all'implementazione di una macchina.) Infine, un paio di formati strani suggeriti (ad esempio, " 20bc ") includono due parti di dati che sono entrambi rappresentati nel suo ID formato .

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

Mnemonico Dimensioni dei bit Significato
b 8 immediatamente firmato da yte
c 16, 32 indice di pool costante
f 16 costanti di interfaccia (usate solo nei formati collegati staticamente)
h 16 h con segno immediato (bit di ordine superiore di un valore a 32 o 64 bit; i bit di ordine inferiore sono tutti 0 )
io 32 immediato firmato int o float a 32 bit
l 64 immediato firmato lungo o doppio a 64 bit
m 16 costanti di metodo (utilizzate solo nei formati collegati staticamente)
n 4 immediato firmato n ibble
S 16 immediato firmato s corto
t 8, 16, 32 ramo t arg
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 l'opcode denominato ed è facoltativamente seguita da uno o più argomenti, a loro volta separati da virgole.

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

Gli argomenti che denominano 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 a loro volta utilizzano il prefisso " r " per i loro registri. (Cioè, questa decisione permette di parlare insieme di registri virtuali e reali senza bisogno di perifrasi.)

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 per bit.

Gli argomenti che indicano un offset di indirizzo relativo di 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 di costanti si fa riferimento. Ogni codice operativo che utilizza tale formato consente esplicitamente un solo tipo di costante; vedere il riferimento al codice operativo per capire la corrispondenza. I tipi di pool costanti sono " string " (indice pool di stringhe), " type " (indice pool di tipi), " field " (indice pool di campi), " meth " (indice pool di metodi) e " site " (indice di chiamata del sito ).

Simile alla rappresentazione degli indici di pool costanti, ci sono anche moduli suggeriti (opzionali) 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 fa esplicitamente parte della sintassi ma sceglie invece una variante, ogni variante viene elencata con il prefisso " [ X = N ] " (es. " [A=2] ") per indicare la corrispondenza .

I formati

Formato ID Sintassi Codici operativi notevoli coperti
N / A 00x N/A pseudo-formato utilizzato per i codici operativi inutilizzati; suggerito per l'uso come formato nominale per un codice operativo punto di interruzione
ØØ| operazione 10 volte op
B|A| operazione 12x op vA, vB
11n op vA, #+B
AA| operazione 11x op vAA
10 t op +AA vai a
ØØ| op AAAA 20 t op +AAAA vai a/16
AA| op 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 es. riferimenti al metodo per un errore di metodo senza tale errore)
AA| op BBBB 22x op vAA, vBBBB
21t op vAA, +BBBB
21s op vAA, #+BBBB
21h op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
21c op vAA, digita @BBBB
op vAA, campo@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op vAA, stringa@BBBB
check-cast
classe const
const-metodo-handle
const-metodo-tipo
const-string
AA| op CC|BB 23 volte 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, tipo@CCCC
op vA, vB, campo@CCCC
istanza di
22cs op vA, vB, fieldoff@CCCC formato suggerito per istruzioni di accesso al campo collegate staticamente di formato 22c
ØØ| op AAAA lo AAAA ciao 30 t op +AAAAAAAA vai a/32
ØØ| op 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 BBBB F|E|D|C 35c [ A=5 ] op {vC, vD, vE, vF, vG}, meta@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, sito@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, digita @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 delle lettere qui riflette il desiderio di fare il conteggio 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 delle lettere qui riflette il desiderio di fare il conteggio e l'indice di riferimento ha la stessa etichetta del formato 3rms.

formato suggerito per le istruzioni invoke-virtual e invoke-super collegate staticamente di 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 fare il conteggio e l'indice di riferimento ha la stessa etichetta del formato 3rmi.

formato suggerito per le istruzioni inline linkate invoke-static e invoke-virtual di formato 35c
AA| op BBBB CCCC 3rc op {vCCCC .. vNNNN}, meta@BBBB
op {vCCCC .. vNNNN}, sito@BBBB
op {vCCCC .. vNNNN}, digita @BBBB

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

3rm 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 di formato 3rc
3rmi 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 inline linkate invoke-static e invoke-virtual di formato 3rc
A|G| op BBBB F|E|D|C HHHH 45cc [ A=5 ] op {vC, vD, vE, vF, vG}, metan@BBBB, proto@HHHH
[ A=4 ] op {vC, vD, vE, vF}, meta@BBBB, proto@HHHH
[ A=3 ] op {vC, vD, vE}, meta@BBBB, proto@HHHH
[ A=2 ] op {vC, vD}, meta@BBBB, proto@HHHH
[ A=1 ] op {vC}, meta@BBBB, proto@HHHH
invoca-polimorfico
AA| op BBBB CCCC HHHH 4rc op> {vCCCC .. vNNNN}, meta@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, #+BBBBBBBBBBBBBBBBBB const-wide