Formatos de instrução executável do Dalvik

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, #+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 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@CCCC
op 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@BBBB

A 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@BBBB

A 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@BBBB

A 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@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, type@BBBB

em que NNNN = CCCC+AA-1, ou seja, A determina a contagem 0..255, e C determina o primeiro registro

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

em que NNNN = CCCC+AA-1, ou seja, A determina a contagem 0..255, e C determina o primeiro registro

formato sugerido para instruções invoke-virtual e invoke-super vinculadas de forma estática do formato 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

em que NNNN = CCCC+AA-1, ou seja, A determina a contagem 0..255, e C determina o primeiro registro

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 NNNN = CCCC+AA-1, ou seja, A determina a contagem 0..255, e C determina o primeiro registro

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