In questa pagina sono elencati i formati di istruzioni utilizzati dal formato e dal bytecode di Dalvik. È pensato per essere utilizzato insieme al documento di riferimento del bytecode.
Descrizioni a livello di bit
La prima colonna della tabella del formato elenca il layout a bit del formato. È costituito da una o più "parole" separate da spazi, ciascuna delle quali descrive un'unità di codice di 16 bit. Ogni carattere di una parola rappresenta quattro bit, letti dai bit più alti a quelli più bassi, con barre verticali ("|
") intersecate per facilitare la lettura. Le lettere maiuscole
in sequenza da "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'istruzione di otto bit all'interno del formato. Un zero barrato
("Ø
") viene utilizzato per indicare che tutti i bit devono essere
zero nella posizione indicata.
Per la maggior parte, le lettere vanno dalle unità di codice precedenti a quelle successive e dall'ordine basso a quello alto all'interno di un'unità di codice. Tuttavia, esistono alcune eccezioni a questa regola generale, che vengono fatte per fare in modo che i nomi delle parti con significato simile siano uguali in diversi formati di istruzioni. Questi casi sono indicati esplicitamente nelle descrizioni dei formati.
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 più bassi e da una coppia di valori di quattro bit
negli otto bit più alti; la seconda parola è costituita da un singolo
valore di 16 bit.
ID formato
La seconda colonna della tabella dei formati 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 contenuti nel formato (massimo, poiché alcuni formati possono supportare un numero variabile di registri), con la designazione speciale "r
" che indica che è codificato un intervallo di registri. La lettera finale indica in modo semi-mnemonico il tipo di eventuali dati aggiuntivi codificati dal formato. Ad esempio, il formato "21t
" ha una lunghezza di due, contiene un riferimento a un registro e un target di ramo.
I formati di collegamento statico suggeriti hanno un suffisso aggiuntivo "s
", per un totale di quattro caratteri. Analogamente,
i formati di collegamento "in linea" suggeriti hanno un suffisso "i
" aggiuntivo. In questo contesto, il collegamento in linea è simile al collegamento statico,
tranne che con collegamenti più diretti all'implementazione di una macchina.
Infine, un paio di formati insoliti suggeriti (ad es.
"20bc
") includono due dati entrambi rappresentati nell'ID formato.
Di seguito è riportato l'elenco completo delle lettere del codice tipo. Tieni presente che alcuni moduli hanno dimensioni diverse, a seconda del formato:
Mnemonico | Dimensioni dei bit | Significato |
---|---|---|
b | 8 | Byte firmato immediato |
c | 16, 32 | Indice del pool costante |
f | 16 | Costanti interface (utilizzate solo nei formati con collegamento statico) |
h | 16 | hat con segno immediato (bit di ordine superiore di un valore di 32 o 64 bit; i bit di ordine inferiore sono tutti 0 )
|
i | 32 | int firmato immediato o virgola mobile a 32 bit |
l | 64 | long firmato immediato o doppio a 64 bit |
m | 16 | Costanti dei metodi (utilizzate solo nei formati con collegamento statico) |
n | 4 | nibble firmato immediato |
s | 16 | short firmato immediato |
t | 8, 16, 32 | target ramo |
x | 0 | nessun dato aggiuntivo |
Sintassi
La terza colonna della tabella dei formati indica la sintassi per le istruzioni rivolte agli utenti 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.
Ogni volta che un argomento fa riferimento a un campo della prima colonna, la lettera corrispondente è indicata nella sintassi, ripetuta una volta per ogni quattro bit del campo. Ad esempio, un campo a otto bit etichettato
"BB
" nella prima colonna sarà etichettato anche
"BB
" nella colonna della sintassi.
Gli argomenti che indicano un registro hanno il formato "vX
".
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 eseguibile Dalvik, che userebbero
anche il prefisso "r
" per i propri registri. In altre parole, questa decisione consente di parlare sia dei registri virtuali sia di quelli reali contemporaneamente senza bisogno di circonlocuzioni.
Gli argomenti che indicano un valore letterale hanno la forma
"#+X
". Alcuni formati indicano letterali che hanno solo
i bit di ordine superiore diversi da zero; per questi, gli zeri
sono rappresentati esplicitamente nella sintassi, anche se non
appaiono nella rappresentazione a bit.
Gli argomenti che indicano un offset dell'indirizzo dell'istruzione relativa hanno la forma "+X
".
Gli argomenti che indicano un indice del pool di costanti letterale hanno il formato
"kind@X
", dove "kind
"
indica il pool di costanti a cui si fa riferimento. Ogni opcode che utilizza questo formato consente esplicitamente un solo tipo di costante. Consulta il riferimento all'opcode per capire la corrispondenza. I tipi di pool di costanti 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 sito di chiamata).
Analogamente alla rappresentazione degli indici del pool di costanti, esistono anche forme (facoltative) suggerite che indicano offset o indici precollegati. Esistono due tipi di valori prelinkati suggeriti: offset della vtable
(indicati come "vtaboff
") e offset dei campi (indicati come
"fieldoff
").
Nei casi in cui un valore di formato non fa esplicitamente parte della sintassi, ma seleziona una variante, ogni variante viene elencata con il prefisso "[X=N]
" (ad es. "[A=2]
") per indicare la corrispondenza.
Formati
Formato | ID | Sintassi | Opcode importanti coperti |
---|---|---|---|
N/A | 00x | N/A |
pseudo-formato utilizzato per le opzioni di codice non utilizzate; consigliato per l'utilizzo come formato nominale per un'opzione di codice di interruzione |
ØØ|op | 10 volte | op |
|
B|A|op | 12x | op vA, vB |
|
11n | op vA, #+B |
||
AA|op | 11x | op V AA |
|
10t | op +AA |
vai a | |
ØØ|op AAAA | 20t | op +AAAA |
goto/16 |
AA|op BBBB | 20 a.C. | op AA, kind@BBBB |
Formato suggerito per gli errori di verifica determinati in modo statico; A è il tipo di errore e B è un indice in una tabella appropriata per il tipo (ad es. riferimenti ai metodi per un errore di metodo non esistente) |
AA|op BBBB | 22x | op vAA, vBBBB |
|
21t | op vAA, +BBBB |
||
21 sec | op vAA, #+BBBB |
||
21 ore | op vAA, #+BBBB0000op vAA, #+BBBB000000000000
|
||
21 °C | op vAA, type@BBBBop vAA, field@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop vAA, string@BBBB
|
check-cast const-class const-method-handle const-method-type 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 |
|
22 sec | op vA, vB, #+CCCC |
||
22 °C | op vA, vB, tipo@CCCCop vA, vB, campo@CCCC
|
instance-of | |
22cs | op vA, vB, fieldoff@CCCC |
Formato suggerito per le istruzioni di accesso ai campi collegati in modo statico nel formato 22c | |
ØØ|op AAAAlo AAAAhi | 30t | 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, stringa@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 @BBBBLa scelta insolita delle lettere riflette il desiderio di dare al conteggio e all'indice di riferimento la stessa etichetta del formato 3rc. |
|
35ms | [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@BBBBLa scelta insolita delle lettere riflette il desiderio di dare al conteggio e all'indice di riferimento la stessa etichetta del formato 3rms. |
Formato suggerito per le istruzioni invoke-virtual
e invoke-super collegate in modo statico di formato 35c
|
|
35mi | [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@BBBBLa scelta insolita delle lettere riflette il desiderio di assegnare al conteggio e all'indice di riferimento la stessa etichetta del formato 3rmi. |
Formato suggerito per le istruzioni invoke-static
e invoke-virtual collegate in linea nel formato 35c
|
|
AA|op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBdove |
|
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBBdove |
Formato suggerito per invoke-virtual collegato in modo statico
e istruzioni invoke-super di formato 3rc
|
|
3rmi | op {vCCCC .. vNNNN}, in linea@BBBBdove |
Formato suggerito per invoke-static
e invoke-virtual collegati in linea e istruzioni per il formato 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|op BBBB CCCC HHHH | 4rcc |
op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH
dove |
invoke-polymorphic/range |
AA|op BBBBlo BBBB BBBB BBBBhi | 51l | op vAA, #+BBBBBBBBBBBBBBBB |
a livello di const |