Formatos de instrucciones ejecutables de Dalvik

Esta página enumera los formatos de instrucción utilizados por el formato ejecutable (DEX) de Dalvik y el código de bytes de Dalvik. Está destinado a ser utilizado junto con el documento de referencia de código de bytes .

Descripciones bit a bit

La primera columna de la tabla de formato enumera el diseño bit a bit del formato. Consta de una o más "palabras" separadas por espacios, cada una de las cuales describe una unidad de código de 16 bits. Cada carácter de una palabra representa cuatro bits, leídos desde los bits más altos hasta los más bajos, con barras verticales (" | ") intercaladas para ayudar en la lectura. Las letras mayúsculas en secuencia desde " A " se utilizan para indicar campos dentro del formato (que luego se definen aún más mediante la columna de sintaxis). El término " op " se utiliza para indicar la posición de un código de operación de ocho bits dentro del formato. Se utiliza un cero con barra (" Ø ") para indicar que todos los bits deben ser cero en la posición indicada.

En su mayor parte, las letras proceden de unidades de código anteriores a unidades de código posteriores, y de orden inferior a orden superior dentro de una unidad de código. Sin embargo, existen algunas excepciones a esta regla general, que se realizan para que la denominación de partes con significado similar sea la misma en diferentes formatos de instrucción. Estos casos se indican explícitamente en las descripciones de formato.

Por ejemplo, el formato " B|A| op CCCC " indica que el formato consta de dos unidades de código de 16 bits. La primera palabra consta del código de operación en los ocho bits inferiores y un par de valores de cuatro bits en los ocho bits superiores; y la segunda palabra consta de un único valor de 16 bits.

Formatear ID

La segunda columna de la tabla de formato indica el identificador corto del formato, que se utiliza en otros documentos y en el código para identificar el formato.

La mayoría de los ID de formato constan de tres caracteres, dos dígitos seguidos de una letra. El primer dígito indica la cantidad de unidades de código de 16 bits en el formato. El segundo dígito indica el número máximo de registros que contiene el formato (máximo, ya que algunos formatos pueden acomodar un número variable de registros), con la designación especial " r " que indica que se codifica un rango de registros. La letra final indica semimnemónicamente el tipo de cualquier dato adicional codificado por el formato. Por ejemplo, el formato " 21t " tiene una longitud de dos, contiene una referencia de registro y, además, contiene un destino de rama.

Los formatos de enlaces estáticos sugeridos tienen un sufijo " s " adicional, lo que los convierte en cuatro caracteres en total. De manera similar, los formatos de enlace "en línea" sugeridos tienen un sufijo " i " adicional. (En este contexto, los enlaces en línea son como los enlaces estáticos, excepto que tienen vínculos más directos con la implementación de una máquina). Finalmente, un par de formatos extraños sugeridos (por ejemplo, " 20bc ") incluyen dos datos que están representados en su ID de formato. .

La lista completa de letras de código tipográfico es la siguiente. Tenga en cuenta que algunos formularios tienen diferentes tamaños, según el formato:

Mnemotécnico Tamaños de bits Significado
b 8 inmediato firmado por byte
C 16, 32 índice de grupo constante
F dieciséis Constantes de interfaz (solo se usan en formatos vinculados estáticamente)
h dieciséis h con signo inmediato (bits de orden superior de un valor de 32 o 64 bits; los bits de orden inferior son todos 0 )
i 32 entrada con signo inmediato o flotante de 32 bits
yo 64 inmediato con signo largo o doble de 64 bits
metro dieciséis Constantes de método (solo se usan en formatos vinculados estáticamente)
norte 4 n ibble firmado inmediatamente
s dieciséis corto firmado inmediatamente
t 8, 16, 32 rama t objetivo
X 0 sin datos adicionales

Sintaxis

La tercera columna de la tabla de formato indica la sintaxis orientada al usuario para las instrucciones que utilizan el formato indicado. Cada instrucción comienza con el código de operación nombrado y, opcionalmente, va seguida de uno o más argumentos, separados por comas.

Siempre que un argumento se refiere a un campo de la primera columna, la letra de ese campo se indica en la sintaxis, repetida una vez por cada cuatro bits del campo. Por ejemplo, un campo de ocho bits denominado " BB " en la primera columna también estaría etiquetado como " BB " en la columna de sintaxis.

Los argumentos que nombran un registro tienen la forma " v X ". Se eligió el prefijo " v " en lugar del más común " r " exactamente para evitar conflictos con arquitecturas (no virtuales) en las que se podría implementar el formato Dalvik Executable y que a su vez utilizan el prefijo " r " para sus registros. (Es decir, esta decisión hace posible hablar de registros virtuales y reales juntos sin necesidad de circunloquios).

Los argumentos que indican un valor literal tienen la forma " #+ X ". Algunos formatos indican literales que sólo tienen bits distintos de cero en sus bits de orden superior; para estos, los ceros se representan explícitamente en la sintaxis, aunque no aparecen en la representación bit a bit.

Los argumentos que indican un desplazamiento relativo de la dirección de instrucción tienen la forma " + X ".

Los argumentos que indican un índice de grupo constante literal tienen la forma " kind @ X ", donde " kind " indica a qué grupo constante se hace referencia. Cada código de operación que utiliza dicho formato permite explícitamente sólo un tipo de constante; consulte la referencia del código de operación para descubrir la correspondencia. Los tipos de grupo constante son " string " (índice de grupo de cadenas), " type " (índice de grupo de tipos), " field " (índice de grupo de campos), " meth " (índice de grupo de métodos) y " site " (índice de sitio de llamadas). ).

De manera similar a la representación de índices de conjunto constante, también hay formularios sugeridos (opcionales) que indican compensaciones o índices previnculados. Hay dos tipos de valores previnculados sugeridos: compensaciones de vtable (indicadas como " vtaboff ") y compensaciones de campo (indicadas como " fieldoff ").

En los casos en los que un valor de formato no forma parte explícitamente de la sintaxis sino que selecciona una variante, cada variante se enumera con el prefijo " [ X = N ] " (por ejemplo, " [A=2] ") para indicar la correspondencia. .

Formatos

Formato IDENTIFICACIÓN Sintaxis Códigos de operación notables cubiertos
N / A 00x N/A pseudoformato utilizado para códigos de operación no utilizados; sugerido para su uso como formato nominal para un código de operación de punto de interrupción
ØØ| op 10x op
B|A| op 12x op vA, vB
11n op , #+B
AA| op 11x op VAA
10 toneladas op + AA ir a
ØØ| en AAAA 20 toneladas op +AAAA ir a/16
AA| en BBBB 20 a.C. op AA, amable@BBBB formato sugerido para errores de verificación determinados estáticamente; A es el tipo de error y B es un índice en una tabla apropiada para el tipo (por ejemplo, referencias de métodos para un error que no existe).
AA| en BBBB 22x op vAA, vBBBB
21t op vAA, +BBBB
21 op vAA, #+BBBB
21h op vAA, #+BBBB0000
op vAA, #+BBBB000000000000
21c op vAA, escriba@BBBB
op vAA, campo@BBBB
op vAA, método_handle@BBBB
op vAA, proto@BBBB
op vAA, cadena@BBBB
chequeo
clase constante
mango-método-const
tipo de método constante
cadena constante
AA| en CC|BB 23x op vAA, vBB, vCC
22b op vAA, vBB, #+CC
B|A| en CCCC 22 toneladas op vA, vB, +CCCC
22 op vA, vB, #+CCCC
22c op vA, vB, tipo@CCCC
op vA, vB, campo@CCCC
en vez de
22cs op vA, vB, campooff@CCCC formato sugerido para instrucciones de acceso a campos vinculados estáticamente de formato 22c
ØØ| op AAAA lo AAAA hola 30 toneladas op +AAAAAAAA ir a/32
ØØ| en AAAA BBBB 32x op vAAAA, vBBBB
AA| op BBBB lo BBBB hola 31i op vAA, #+BBBBBBBB
31t op vAA, +BBBBBBBB
31c op vAA, cadena@BBBBBBBB cadena constante/jumbo
A|G| op BBBB F|E|D|C 35c [ A=5 ] op {vC, vD, vE, vF, vG}, meta@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, sitio@BBBB
[ A=5 ] op {vC, vD, vE, vF, vG}, tipo@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

La elección inusual de las letras aquí refleja el deseo de que el recuento y el índice de referencia tengan la misma etiqueta que en el 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

La elección inusual de las letras aquí refleja el deseo de que el recuento y el índice de referencia tengan la misma etiqueta que en el formato 3rms.

formato sugerido para instrucciones invoke-virtual e invoke-super vinculadas estáticamente de formato 35c
35 millas [ A=5 ] op {vC, vD, vE, vF, vG}, en línea@BBBB
[ A=4 ] op {vC, vD, vE, vF}, en línea@BBBB
[ A=3 ] op {vC, vD, vE}, en línea@BBBB
[ A=2 ] op {vC, vD}, en línea@BBBB
[ A=1 ] op {vC}, en línea@BBBB

La elección inusual de las letras refleja el deseo de que el recuento y el índice de referencia tengan la misma etiqueta que en el formato 3rmi.

formato sugerido para instrucciones invoke-static e invoke-virtual vinculadas en línea de formato 35c
AA| en BBBB CCCC 3rc op {vCCCC .. vNNNN}, meta@BBBB
op {vCCCC .. vNNNN}, sitio@BBBB
op {vCCCC .. vNNNN}, escriba@BBBB

donde NNNN = CCCC+AA-1 , es decir, A determina el recuento 0..255 y C determina el primer registro

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

donde NNNN = CCCC+AA-1 , es decir, A determina el recuento 0..255 y C determina el primer registro

formato sugerido para instrucciones invoke-virtual e invoke-super vinculadas estáticamente de formato 3rc
3rmi op {vCCCC .. vNNNN}, en línea@BBBB

donde NNNN = CCCC+AA-1 , es decir, A determina el recuento 0..255 y C determina el primer registro

formato sugerido para instrucciones invoke-static e invoke-virtual vinculadas en línea de formato 3rc
A|G| op BBBB F|E|D|C HHHH 45cc [ A=5 ] op {vC, vD, vE, vF, vG}, meta@BBBB, proto@HHHH
[ A=4 ] op {vC, vD, vE, vF}, meta@BBBB, proto@HHHH
[ A=3 ] op {vC, vD, vE}, meta@BBBB, proto@HHHH
[ A=2 ] op {vC, vD}, meta@BBBB, proto@HHHH
[ A=1 ] op {vC}, meta@BBBB, proto@HHHH
invocar-polimórfico
AA| op BBBB CCCC HHHH 4cc op> {vCCCC .. vNNNN}, meta@BBBB, proto@HHHH

donde NNNN = CCCC+AA-1 , es decir, A determina el recuento 0..255 y C determina el primer registro

invocar-polimórfico/rango
AA| op BBBB lo BBBB BBBB BBBB hola 51 litros op vAA, #+BBBBBBBBBBBBBBBB constante