Esta página lista os formatos de instrução usados pelo formato Dalvik Executable (DEX) e pelo bytecode Dalvik. Ele deve ser usado em conjunto com o documento de referência do bytecode.
Descrições bit a bit
A primeira coluna na tabela de formato lista o layout de bit do
formato. Ele consiste em uma ou mais "palavras" separadas por espaços, cada uma
delas descrevendo uma unidade de código de 16 bits. Cada caractere em uma palavra
representa quatro bits, lidos de bits altos para baixos, com barras verticais
("|
") intercaladas para facilitar a leitura. Letras maiúsculas
em sequência de "A
" são usadas para indicar campos no
formato, que são definidos pela coluna de sintaxe. O termo
"op
" é usado para indicar a posição de uma operação de 8 bits
no formato. Um zero com barra
("Ø
") é usado para indicar que todos os bits precisam ser
zero na posição indicada.
Na maior parte, a letra passa de unidades de código anteriores para unidades de código posteriores e de ordem baixa para ordem alta em uma unidade de código. No entanto, há algumas exceções a essa regra geral, que são feitas para que a nomenclatura de partes de significado semelhante seja a mesma em diferentes formatos de instrução. Esses casos são indicados explicitamente nas descrições do formato.
Por exemplo, o formato "B|A|op CCCC
" indica
que o formato consiste em duas unidades de código de 16 bits. A primeira palavra
consiste no opcode nos oito bits mais baixos e um par de valores de quatro bits
nos oito bits mais altos. A segunda palavra consiste em um único
valor de 16 bits.
IDs de formato
A segunda coluna na tabela de formatos indica o identificador curto do formato, que é usado em outros documentos e no código para identificar o formato.
A maioria dos IDs de formato consiste em três caracteres, dois dígitos seguidos por uma
letra. O primeiro dígito indica o número de unidades de código de 16 bits no
formato. O segundo dígito indica o número máximo de registros que o
formato contém (máximo, já que alguns formatos podem acomodar um número
variável de registros), com a designação especial "r
" indicando
que um intervalo de registros está codificado. A letra final semi-mnemônica
indica o tipo de dados extras codificados pelo formato. Por exemplo,
o formato "21t
" tem comprimento 2, contém uma referência de registro
e também contém um destino de ramificação.
Os formatos de vinculação estática sugeridos têm um sufixo
"s
" adicional, totalizando quatro caracteres. Da mesma forma,
os formatos de vinculação "inline" sugeridos têm um sufixo "i
"
adicional. Nesse contexto, a vinculação inline é semelhante à vinculação estática,
exceto com vínculos mais diretos na implementação de uma máquina.
Por fim, alguns formatos sugeridos estranhos (por exemplo,
"20bc
") incluem dois dados que são
representados no ID do formato.
Confira a lista completa de letras de tipocode abaixo. Algumas formas têm tamanhos diferentes, dependendo do formato:
Mnemônico | Tamanhos de bits | Significado |
---|---|---|
b | 8 | byte assinado imediatamente |
c | 16, 32 | índice de pool constante |
f | 16 | constantes de face (usadas apenas em formatos vinculados de forma estática) |
h | 16 | h assinado imediato (bits de alta ordem de um valor de 32 ou 64 bits; os bits de ordem inferior são todos 0 )
|
i | 32 | int assinado imediato ou ponto flutuante de 32 bits |
l | 64 | long assinado imediato ou duplo de 64 bits |
m | 16 | Constantes de método (usadas apenas em formatos vinculados de forma estática) |
n | 4 | nibble assinado imediatamente |
s | 16 | short assinado imediatamente |
t | 8, 16, 32 | branch target |
x | 0 | sem dados adicionais |
Sintaxe
A terceira coluna da tabela de formato indica a sintaxe orientada a humanos para instruções que usam o formato indicado. Cada instrução começa com o opcode nomeado e é opcionalmente seguida por um ou mais argumentos, separados por vírgulas.
Sempre que um argumento se refere a um campo da primeira coluna, a
letra desse campo é indicada na sintaxe, repetida uma vez para
cada quatro bits do campo. Por exemplo, um campo de oito bits marcado como
"BB
" na primeira coluna também seria marcado como
"BB
" na coluna de sintaxe.
Os argumentos que nomeiam um registro têm o formato "vX
".
O prefixo "v
" foi escolhido em vez do mais comum
"r
" exatamente para evitar conflitos com arquiteturas (não virtuais)
em que o formato executável Dalvik pode ser implementado e que usam
o prefixo "r
" para os registros. Ou seja, essa
decisão permite falar sobre registros virtuais e reais
juntos sem a necessidade de circunlocução.
Os argumentos que indicam um valor literal têm a forma
"#+X
". Alguns formatos indicam literais que só
têm bits diferentes de zero nos bits de ordem alta. Para esses casos, os zeros
são representados explicitamente na sintaxe, mesmo que não
apareçam na representação bit a bit.
Os argumentos que indicam um deslocamento de endereço de instrução relativo têm a
forma "+X
".
Os argumentos que indicam um índice de pool de constantes literal têm o formato
"kind@X
", em que "kind
"
indica qual pool de constantes está sendo referenciado. Cada opcode que
usa esse formato permite explicitamente apenas um tipo de constante. Consulte
a referência de opcode para descobrir a correspondência. Os
tipos de pool de constantes são "string
" (índice de pool de strings),
"type
" (índice de pool de tipos), "field
" (índice de pool
de campos), "meth
" (índice de pool de métodos) e
"site
" (índice de local de chamada).
Assim como a representação de índices de pool de constantes, também há
formas sugeridas (opcionais) que indicam deslocamentos ou
índices pré-vinculados. Há dois tipos de valor sugerido pré-vinculado: deslocamentos de vtable
(indicados como "vtaboff
") e deslocamentos de campo (indicados como
"fieldoff
").
Nos casos em que um valor de formato não faz parte explicitamente da sintaxe,
mas escolhe uma variante, cada variante é listada com o prefixo
"[X=N]
" (por exemplo, "[A=2]
") para indicar
a correspondência.
Formatos
Formato | ID | Sintaxe | Opcodes importantes cobertos |
---|---|---|---|
N/A | 00x | N/A |
Pseudoformato usado para opcodes não utilizados; sugerido para uso como formato nominal para um opcode de ponto de interrupção |
ØØ|op | 10x | op |
|
B|A|op | 12x | op vA, vB |
|
11n | op vA, #+B |
||
AA|op | 11x | op vAA |
|
10t | op +AA |
ir para | |
ØØ|op AAAA | 20t | op +AAAA |
goto/16 |
AA|op BBBB | 20bc | op AA, kind@BBBB |
formato sugerido para erros de verificação determinados de forma estática; A é o tipo de erro e B é um índice em uma tabela adequada ao tipo (por exemplo, referências de método para um erro de método inválido) |
AA|op BBBB | 22x | op vAA, vBBBB |
|
21t | op vAA, +BBBB |
||
21s | op vAA, #+BBBB |
||
21h | op vAA, #+BBBB0000op vAA, #+BBBB000000000000
|
||
21c | 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 | 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
|
instância-de | |
22cs | op vA, vB, fieldoff@CCCC |
Formato sugerido para instruções de acesso a campo vinculado de forma estática do 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, string@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 @BBBBA escolha incomum de letras aqui reflete o desejo de fazer a contagem e o índice de referência terem o mesmo rótulo do 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@BBBBA escolha incomum de letras aqui reflete o desejo de fazer a contagem e o índice de referência terem o mesmo rótulo que no formato 3rms. |
formato sugerido para instruções invoke-virtual
e invoke-super vinculadas de forma estática do formato 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@BBBBA escolha incomum de letras aqui reflete o desejo de fazer a contagem e o índice de referência terem o mesmo rótulo do formato 3rmi. |
Formato sugerido para instruções invoke-static
e invoke-virtual vinculadas inline do formato 35c
|
|
AA|op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBem que |
|
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBBem que |
formato sugerido para instruções invoke-virtual
e invoke-super vinculadas de forma estática do formato 3rc
|
|
3rmi | op {vCCCC .. vNNNN}, inline@BBBBem que |
Formato sugerido para instruções invoke-static
vinculadas inline e invoke-virtual do 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=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
em que |
invoke-polymorphic/range |
AA|op BBBBlo BBBB BBBB BBBBhi | 51l | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |