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, #+BBBB0000op vAA, #+BBBB000000000000 | ||
21c | op vAA, digite@BBBBop vAA, campo@BBBBop vAA, method_handle@BBBBop vAA, proto@BBBBop 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@CCCCop 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 @BBBBA 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@BBBBA 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@BBBBA 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@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, digite@BBBB onde | |
3 rms | op {vCCCC .. vNNNN}, vtaboff@BBBB onde | formato sugerido para instruções invoke-virtual e invoke-super vinculadas estaticamente no formato 3rc | |
3rmi | op {vCCCC .. vNNNN}, inline@BBBB onde | 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 | invocar-polimórfico/intervalo |
AA| op BBBB lo BBBB BBBB BBBB oi | 51 litros | op vAA, #+BBBBBBBBBBBBBBB | em toda a const |