¿Cómo decodificar las instrucciones ARMv7?

Estoy tratando de entender la codificación de instrucciones ARM.

La siguiente imagen muestra el código C junto con sus correspondientes instrucciones de ensamblaje:

ingrese la descripción de la imagen aquí

Miré el manual de referencia de ARMv7 . Sin embargo, no pude encontrar la relación entre el código de máquina y la instrucción de ensamblaje correspondiente.

Por ejemplo,

No pude relacionar el código de la máquina

F1AD0D08

a la instrucción de montaje

sub.w sp, sp, #8

¿Podrías ayudarme con esto?

================================================== ====

Según las respuestas y después de mirar el manual de referencia, agregué la siguiente información.

El nombre del procesador es Cortex-M4F .

La arquitectura del procesador del microcontrolador que uso es ARMv7 .

En concreto, el perfil de microcontrolador empleado es ARMv7-M .

Del manual :

ARMv7-M El perfil de microcontrolador para sistemas que solo admiten el conjunto de instrucciones Thumb y donde el tamaño general y la operación determinista para una implementación son más importantes que el rendimiento absoluto.

Por favor, enlace al manual exacto del que está hablando.
@pipe Agregué el enlace dentro de la publicación anterior.
No es ARM7, es Thumb. O al menos algo de eso lo es (7808 = lrdb, 490D = carga relativa a la PC).
@ pjc50 ¿Podría explicar cómo decodificar "490D"?
es armv7 (arm7 es armv4). está el conjunto de instrucciones del brazo y el conjunto de instrucciones del pulgar y luego las extensiones thumb2. el 490d es un pulgar, el sub.w es un pulgar2. en los documentos de armv7, mire la subinstrucción y luego baje hasta la(s) codificación(es) thumb2 de 32 bits. también mire ldr y la codificación thumb1 o "Todas las variantes de pulgar".
@dwelch Estoy un poco confundido. Escribe ARMv7 en el manual pero dijiste que arm7 es armv4.
La numeración de versiones de ARM es tremendamente confusa. El número en el chip (sin V) no tiene ninguna relación con la versión del conjunto de instrucciones (con una V). por ejemplo, los chips "ARM926EJ-S" utilizan la arquitectura "ARMv5TE". Mi comentario "no ARM7" omitió la V y, en cualquier caso, debería haber dicho "no ARM de 32 bits". dwelch es correcto.
arm7 es el nombre comercial que usa armv4, arm9 usa armv5, arm11 usa armv6, luego ingresa a cortex-a y cortex-r que usan armv7 (o armv8). brazo7 != brazo7. un término es la numeración arquitectónica el otro es un nombre de producto
y hay suficiente diferencia entre armv7(-ar) y armv7-m que si está hablando de armv7-m es una buena idea poner la m ahí.
sí, confuso, doloroso, detallado, etc. misma arquitectura en una tecnología diferente 14nm en lugar de 22)
para esta pregunta en particular, la decodificación de estas instrucciones se trata en los manuales de referencia de arquitectura armv7-m y armv7-ar, ya que ambos admiten thumb2.

Respuestas (4)

El manual de referencia de ARMv7-M no tiene una tabla de búsqueda de decodificación , pero se enumera la codificación de cada instrucción.

En el manual específico que has enlazado, lo encontrarás en el apartado A6.7 - Alphabetical list of ARMv7-M Thumb instruction.

Este contiene, como se indicó, una lista de cada instrucción y su codificación binaria correspondiente. Por ejemplo, la página A6-16 tiene la codificación binaria para la ADC (immediate)instrucción. Podemos ver que comienza con 11110...y abarca dos palabras.

El problema es ir "al revés". De hecho, el manual contiene toda la información necesaria, pero es difícil de buscar. El desensamblador tiene las estructuras de datos para hacerlo por usted, y si quiere una tabla y lo hace manualmente, sugiero mirar los archivos de código fuente para un desensamblador ARM, por ejemplo, GNU binutils.

Vale la pena señalar, como fanático de la arquitectura 68000 que soy, que el manual de referencia M68000PM/AD para el conjunto de instrucciones 68000 contiene esta tabla inversa, ordenada en orden binario, lo que hace que esta búsqueda sea trivial .
Una mirada rápida a las fuentes de binutils muestra que el código para el desensamblador ARM se puede encontrar aquí

En el ARM ARMv7-m ARM que estoy buscando codificar T3 para restar inmediato que es compatible con la arquitectura ARMv7-M está en la forma

SUB{S}<c>.W <Rd>,<Rn>,#<const>

el patrón de bits 11110i01101S.... que coincide con el 0xF1A de la instrucción, sp es 13 y las dos instancias de 0XD en la codificación se alinean con eso junto con el #8 inmediato.

Si observa LDR (literal), la codificación es 0x4800 con un registro e inmediato. esta instrucción, tal como se documenta, hace una carga relativa de PC, por lo que la PC está implícita. Del mismo modo, esta es una carga de 32 bits, por lo que cuando asumimos una alineación de 32 bits, el desplazamiento tiene sentido: 0x34 es 110100, al estar alineados en 32 bits, no necesitamos los dos bits inferiores, queman el espacio de instrucciones, por lo que 1101, que es un 0x0D, da 0x490D como codificación.

Todo está ahí en el documento que está viendo.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0210c/CACCCHGF.html

490D: el '4' = 0100 y el '9' = 1001, por lo que los cinco bits principales son 01001. Mirando hacia abajo en la tabla, se muestra como "carga relativa de PC". Los siguientes tres bits son 001 para 'Rd', el registro de destino. El operando es 'D', que multiplicado por 4 para contar palabras es 0x34.

F1AD0D08 es un poco extraño. Alguien más puede intentarlo.

Pensé en mencionar en esta fecha tardía que la versión actual del Manual de referencia de la arquitectura ARMv7m tiene el Capítulo 5 "La codificación del conjunto de instrucciones del pulgar" que es útil para decodificar las instrucciones CM4. Todavía es bastante difícil, porque esencialmente el conjunto de instrucciones es realmente feo y nada regular :-(

Pero para su F1AD0D08 (1111 0001 1010 1101 0D 08):

Si los bits [15:11] de la media palabra que se está decodificando toman cualquiera de los siguientes valores, la media palabra es la primera media palabra de una instrucción de 32 bits: [vaya a "Codificación de instrucción Thumb de 32 bits" en la página n]

111 10 x1xxxxx -> Procesamiento de datos (binario simple inmediato) [Página a5-141]

111 10 x1 01010 -> SUB (inmediato) [página a7-402]

(esa es la descripción de la instrucción de resta individual. Vemos que coincidimos con la enodación T4) 11110 i1 01010 1101 ... -> ups. "si Rn = 1101, véase SUB (SP menos inmediato) [a7-406]

Ahora estamos codificando T3 de SUB (SP menos inmediato) 11110 i1 01010 1101 0 imm3 rd imm8

Donde juntamos un valor inmediato de 12 bits i:imm3:imm8, que en su caso es 8, y Rd es 0d (r13 o SP).

Ta Da!