Formatos de instruções executáveis ​​Dalvik

Esta página lista os formatos de instruções usados ​​pelo formato executável Dalvik (DEX) e pelo bytecode Dalvik. Ele deve ser usado em conjunto com o documento de referência de bytecode .

Descrições bit a bit

A primeira coluna na tabela de formato lista o layout bit a bit do formato. Consiste em uma ou mais "palavras" separadas por espaços, cada uma das quais descreve uma unidade de código de 16 bits. Cada caractere em uma palavra representa quatro bits, lidos dos bits mais altos para os mais baixos, com barras verticais (" | ") intercaladas para auxiliar na leitura. Letras maiúsculas em sequência de " A " são usadas para indicar campos dentro do formato (que são definidos posteriormente pela coluna de sintaxe). O termo “ op ” é usado para indicar a posição de um opcode de oito bits dentro do formato. Um zero cortado (" Ø ") é usado para indicar que todos os bits devem ser zero na posição indicada.

Na maior parte, as letras prosseguem das unidades de código anteriores para as unidades de código posteriores, e da ordem inferior para a ordem superior dentro de uma unidade de código. No entanto, existem algumas exceções a esta regra geral, que são feitas para fazer com 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 inferiores e em um par de valores de quatro bits nos oito bits superiores; e a segunda palavra consiste em um único valor de 16 bits.

IDs de formato

A segunda coluna na tabela de formatos indica o identificador abreviado 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, pois 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 indica semimnemonicamente o tipo de quaisquer dados extras codificados pelo formato. Por exemplo, o formato " 21t " tem comprimento dois, contém uma referência de registro e, adicionalmente, contém um destino de ramificação.

Os formatos de links estáticos sugeridos têm um sufixo " s " adicional, totalizando quatro caracteres. Da mesma forma, os formatos de link "inline" sugeridos têm um sufixo " i " adicional. (Neste contexto, a vinculação inline é como a vinculação estática, exceto com ligações mais diretas à implementação de uma máquina.) Finalmente, alguns formatos excêntricos sugeridos (por exemplo, " 20bc ") incluem dois pedaços de dados que são ambos representados em seu ID de formato .

A lista completa de letras de código de tipo é a seguinte. Observe que alguns formulários possuem tamanhos diferentes, dependendo do formato:

Mnemônico Tamanhos de bits Significado
b 8 byte assinado imediato
c 16, 32 índice de pool constante
f 16 constantes de interface (usadas apenas em formatos vinculados estaticamente)
h 16 imediato assinado h at (bits de ordem superior com valor de 32 ou 64 bits; bits de ordem inferior são todos 0 )
eu 32 imediato assinado int ou float de 32 bits
eu 64 imediato assinado longo ou duplo de 64 bits
eu 16 Constantes de método (usadas apenas em formatos vinculados estaticamente)
n 4 mordidela assinada imediata
é 16 curto assinado imediatamente
t 8, 16, 32 filial t destino
x 0 sem dados adicionais

Sintaxe

A terceira coluna da tabela de formatos indica a sintaxe orientada para humanos para instruções que utilizam 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 denominado " BB " na primeira coluna também seria rotulado como " BB " na coluna de sintaxe.

Argumentos que nomeiam um registro têm a forma " v X ". O prefixo " v " foi escolhido em vez do mais comum " r " exatamente para evitar conflito com arquiteturas (não virtuais) nas quais o formato Dalvik Executable pode ser implementado e que usam o prefixo " r " para seus registros. (Ou seja, esta decisão torna possível falar conjuntamente de registos virtuais e reais, sem necessidade de rodeios.)

Argumentos que indicam um valor literal têm a forma " #+ X ". Alguns formatos indicam literais que possuem apenas bits diferentes de zero em seus bits de ordem superior; para estes, os zeros são representados explicitamente na sintaxe, embora não apareçam na representação bit a bit.

Argumentos que indicam um deslocamento relativo do endereço da instrução têm a forma " + X ".

Argumentos que indicam um índice literal de conjunto de constantes têm o formato " kind @ X ", onde " kind " indica a qual conjunto de constantes está sendo referido. Cada opcode que usa tal formato permite explicitamente apenas um tipo de constante; veja a referência do opcode para descobrir a correspondência. Os tipos de pool constante são " string " (índice do pool de strings), " type " (índice do pool de tipos), " field " (índice do pool de campos), " meth " (índice do pool de métodos) e " site " (índice do site de chamada). ).

Semelhante à representação de índices de pool constante, também há formas sugeridas (opcionais) que indicam deslocamentos ou índices pré-vinculados. Existem dois tipos de valores pré-vinculados sugeridos: 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

Formatar EU IA Sintaxe Opcodes notáveis ​​cobertos
N / D 00x N/A pseudoformato usado para opcodes não utilizados; sugerido para uso como formato nominal para um código de operação de ponto de interrupção
ØØ| operação 10x op
B|A| operação 12x op vA, vB
11h op vA, #+B
AA| operação 11x op vAA
10t op +AA Vá para
ØØ| op AAAA 20t op +AAAA ir para/16
AA| no BBBB 20 AC op AA, gentil@BBBB formato sugerido para erros de verificação determinados estaticamente; A é o tipo de erro e B é um índice em uma tabela apropriada ao tipo (por exemplo, referências de método para um erro sem tal método)
AA| no BBBB 22x op vAA, vBBBB
21t op vAA, +BBBB
21 anos op vAA, #+BBBB
21h op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
21c op vAA, digite@BBBB
op vAA, campo@BBBB
op vAA, method_handle@BBBB
op vAA, proto@BBBB
op vAA, string@BBBB
verificação
classe const
identificador do método const
tipo de método const
string const
AA| em 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, digite@CCCC
op vA, vB, campo@CCCC
instancia de
22cs op vA, vB, fieldoff@CCCC formato sugerido para instruções de acesso a campos vinculados estaticamente no formato 22c
ØØ| op AAAA ei AAAA oi 30t op +AAAAAAAA ir para/32
ØØ| op AAAA BBBB 32x op vAAAA, vBBBB
AA| op BBBB lo BBBB oi 31i op vAA, #+BBBBBBB
31t op vAA, +BBBBBBB
31c op vAA, string@BBBBBBBB string const/jumbo
A|G| em BBBB F|E|D|C 35c [ A=5 ] op {vC, vD, vE, vF, vG}, metanfetamina@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, site@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, digite@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 das letras aqui reflete o desejo de fazer com que a contagem e o índice de referência tenham 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 das letras aqui reflete o desejo de fazer com que a contagem e o índice de referência tenham o mesmo rótulo do formato 3rms.

formato sugerido para instruções invoke-virtual e invoke-super vinculadas estaticamente no formato 35c
35 milhas [ 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 das letras aqui reflete o desejo de fazer com que a contagem e o índice de referência tenham o mesmo rótulo do formato 3rmi.

formato sugerido para instruções invoke-static e invoke-virtual em linha do formato 35c
AA| no BBBB CCCC 3rc op {vCCCC .. vNNNN}, metanfetamina@BBBB
op {vCCCC .. vNNNN}, site@BBBB
op {vCCCC .. vNNNN}, digite@BBBB

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

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

onde 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 estaticamente no formato 3rc
3rmi op {vCCCC .. vNNNN}, inline@BBBB

onde 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 e invoke-virtual em linha do formato 3rc
A|G| em BBBB F|E|D|C HHHH 45 cc [ A=5 ] op {vC, vD, vE, vF, vG}, metanfetamina@BBBB, proto@HHHH
[ A=4 ] op {vC, vD, vE, vF}, metanfetamina@BBBB, proto@HHHH
[ A=3 ] op {vC, vD, vE}, metanfetamina@BBBB, proto@HHHH
[ A=2 ] op {vC, vD}, metanfetamina@BBBB, proto@HHHH
[ A=1 ] op {vC}, metanfetamina@BBBB, proto@HHHH
invocar-polimórfico
AA| op BBBB CCCC HHHH 4cc op> {vCCCC .. vNNNN}, metanfetamina@BBBB, proto@HHHH

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

invocar-polimórfico/intervalo
AA| op BBBB lo BBBB BBBB BBBB oi 51 litros op vAA, #+BBBBBBBBBBBBBBB em toda a const