En esta página, se enumeran los formatos de instrucciones que usan el formato ejecutable Dalvik (DEX) y el código de bytes Dalvik. Se debe usar junto con el documento de referencia del código de bytes.
Descripciones a nivel de bits
La primera columna de la tabla de formato muestra el diseño de bits del formato. Consiste en 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, que se leen de los bits altos a los bajos, con barras verticales ("|
") intercaladas para facilitar la lectura. Las letras mayúsculas en secuencia de "A
" se usan para indicar campos dentro del formato (que luego se definen mejor en la columna de sintaxis). El término “op
” se usa para indicar la posición de una operación de ocho bits dentro del formato. Se usa un cero con una barra diagonal (“Ø
”) para indicar que todos los bits deben ser cero en la posición indicada.
En su mayor parte, las letras van de las unidades de código anteriores a las posteriores, y de orden bajo a orden alto dentro de una unidad de código. Sin embargo, hay algunas excepciones a esta regla general, que se hacen para que los nombres de las partes con significados similares sean los mismos en diferentes formatos de instrucciones. Estos casos se indican de manera explícita 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 consiste en el 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 consiste en un solo valor de 16 bits.
IDs de formato
La segunda columna de la tabla de formatos indica el identificador corto del formato, que se usa en otros documentos y en el código para identificarlo.
La mayoría de los IDs de formato consisten en 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 la cantidad máxima de registros que contiene el formato (máximo, ya que algunos formatos pueden admitir una cantidad variable de registros), con la designación especial “r
” que indica que se codifica un rango de registros. La letra final indica de forma semimnemotécnica el tipo de datos adicionales codificados 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 bifurcación.
Los formatos de vinculación estática sugeridos tienen un sufijo "s
" adicional, lo que hace que sean cuatro caracteres en total. Del mismo modo, los formatos de vinculación "incorporados" sugeridos tienen un sufijo "i
" adicional. (En este contexto, la vinculación intercalada es como la vinculación estática, excepto que tiene vínculos más directos con la implementación de una máquina).
Por último, se sugieren algunos formatos inusuales (p.ej.,
"20bc
") incluyen dos datos que se representan en su ID de formato.
La lista completa de letras de códigos de tipo es la siguiente. Ten en cuenta que algunos formularios tienen diferentes tamaños, según el formato:
Mnemotecnia | Tamaños de bits | Significado |
---|---|---|
b | 8 | byte firmado de inmediato |
c | 16, 32 | índice de grupo constante |
f | 16 | Constantes de interface (solo se usan en formatos vinculados de forma estática) |
h | 16 | hat firmado inmediato (bits de orden superior de un valor de 32 o 64 bits; los bits de orden inferior son todos 0 )
|
I | 32 | int con firma inmediata o número de punto flotante de 32 bits |
l | 64 | long firmado inmediato o doble de 64 bits |
m | 16 | Constantes de método (solo se usan en formatos vinculados de forma estática) |
n | 4 | nibble firmado de inmediato |
s | 16 | short firmado de inmediato |
t | 8, 16, 32 | objetivo de trama |
x | 0 | sin datos adicionales |
Sintaxis
La tercera columna de la tabla de formato indica la sintaxis orientada a las personas para las instrucciones que usan el formato indicado. Cada instrucción comienza con el código de operación nombrado y, de manera opcional, se le sigue uno o más argumentos, separados por comas.
Siempre que un argumento hace referencia a un campo de la primera columna, la letra de ese campo se indica en la sintaxis y se repite una vez por cada cuatro bits del campo. Por ejemplo, un campo de ocho bits etiquetado como “BB
” en la primera columna también se etiquetaría como “BB
” en la columna de sintaxis.
Los argumentos que nombran un registro tienen el formato "vX
". Se eligió el prefijo "v
" en lugar del más común "r
" precisamente para evitar conflictos con las arquitecturas (no virtuales) en las que se podría implementar el formato ejecutable de Dalvik, que usan el prefijo "r
" para sus registros. (es decir, esta decisión permite 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 solo tienen bits distintos de cero en sus bits de orden superior. En estos casos, los ceros se representan de forma explícita en la sintaxis, aunque no aparecen en la representación por bits.
Los argumentos que indican un desplazamiento de dirección de instrucción relativo tienen la forma "+X
".
Los argumentos que indican un índice de grupo de constantes literales tienen el formato “kind@X
”, en el que “kind
” indica a qué grupo de constantes se hace referencia. Cada opcode que usa un formato de este tipo solo permite explícitamente un tipo de constante. Consulta la referencia de opcode para determinar la correspondencia. Los tipos de grupo de constantes 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 llamada).
Al igual que en la representación de los índices del grupo de constantes, también se sugieren formas (opcionales) que indican offsets o índices vinculados previamente. Existen dos tipos de valores previnculados sugeridos: los desplazamientos de la tabla de vtables (indicados como "vtaboff
") y los desplazamientos de campo (indicados como "fieldoff
").
En los casos en que un valor de formato no forma parte explícitamente de la sintaxis, sino que elige una variante, cada variante se muestra con el prefijo "[X=N]
" (p.ej., "[A=2]
") para indicar la correspondencia.
Formatos
Formato | ID | Sintaxis | Opcodes destacados que se incluyen |
---|---|---|---|
N/A | 00x | N/A |
Es un pseudoformato que se usa para las instrucciones de código no utilizadas. Se recomienda usarlo como formato nominal para una instrucción de código de punto de interrupción. |
ØØ|op | 10 veces | op |
|
B|A|op | 12 veces | op vA, vB |
|
11n | op vA, #+B |
||
AA|op | 11 veces | op vAA |
|
10 t | op +AA |
ir a | |
ØØ|op AAAA | 20 t | op +AAAA |
goto/16 |
AA|op BBBB | 20 a.C. | op AA, kind@BBBB |
Formato sugerido para errores de verificación determinados de forma estática. A es el tipo de error y B es un índice en una tabla adecuada para el tipo (p. ej., referencias de métodos para un error de método no existente). |
AA|op BBBB | 22 veces | op vAA, vBBBB |
|
21 t | op vAA, +BBBB |
||
21 s | op vAA, #+BBBB |
||
21 h | op vAA, #+BBBB0000op vAA, #+BBBB000000000000
|
||
21 °C | 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 | 23 veces | op vAA, vBB, vCC |
|
22b | op vAA, vBB, #+CC |
||
B|A|op CCCC | 22 t | op vA, vB, +CCCC |
|
22 s | op vA, vB, #+CCCC |
||
22c | op vA, vB, type@CCCCop vA, vB, field@CCCC
|
instance-of | |
22 cs | op vA, vB, fieldoff@CCCC |
formato sugerido para instrucciones de acceso a campos vinculados de forma estática de formato 22c | |
ØØ|op AAAAlo AAAAhi | 30 t | 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, cadena@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 @BBBBLa elección inusual de letras aquí refleja el deseo de que el recuento y el índice de referencia tengan la misma etiqueta que en el formato 3rc. |
|
35 ms | [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@BBBBLa elección inusual de 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 y invoke-super vinculadas de forma estática del 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@BBBBLa elección inusual de letras aquí 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 y invoke-virtual intercaladas vinculadas del formato 35c
|
|
AA|op BBBB CCCC | 3rc | op {vCCCC .. vNNNN}, meth@BBBBop {vCCCC .. vNNNN}, site@BBBBop {vCCCC .. vNNNN}, type@BBBBdonde |
|
3rms | op {vCCCC .. vNNNN}, vtaboff@BBBBdonde |
Formato sugerido para instrucciones invoke-virtual y invoke-super vinculadas de forma estática del formato 3rc
|
|
3rmi | op {vCCCC .. vNNNN}, intercalado@BBBBdonde |
Formato sugerido para instrucciones invoke-static y invoke-virtual intercaladas vinculadas de formato 3rc
|
|
A|G|op BBBB F|E|D|C HHHH | 45 cc |
[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=1 ] op {vC}, meth@BBBB, proto@HHHH
|
invoke-polymorphic |
AA|op BBBB CCCC HHHH | 4rcc |
op> {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH
donde |
invoke-polymorphic/range |
AA|op BBBBlo BBBB BBBB BBBBhi | 51 l | op vAA, #+BBBBBBBBBBBBBBBB |
const-wide |