¿Cómo decodificar las instrucciones ARMv7?

6

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

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

Miréel manual de referencia ARMv7 . Sin embargo, no pude encontrar la relación entre el código de máquina y las instrucciones de montaje correspondientes.

Por ejemplo,

No pude relacionar el código de máquina

F1AD0D08

a las instrucciones de montaje

sub.w sp, sp, #8

¿Podrías ayudarme con esto?

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

Basándome en las respuestas y luego de consultar 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 .

Específicamente, el perfil del microcontrolador empleado es ARMv7-M .

Desde el manual :

  

ARMv7-M El perfil del microcontrolador para sistemas que solo admiten el   Conjunto de instrucciones para el pulgar , y donde el tamaño general y determinista   Las operaciones para una implementación son más importantes que las absolutas.   rendimiento.

    
pregunta yildizabdullah

3 respuestas

4

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

En el manual específico que ha vinculado, lo encontrará en la sección A6.7 - Alphabetical list of ARMv7-M Thumb instruction .

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

El problema va "hacia atrás". El manual contiene toda la información necesaria, pero es difícil de buscar. El desensamblador tiene las estructuras de datos en su lugar para hacer eso por usted, y si desea una tabla y hacerlo de forma manual, sugiero que busque los desensambladores ARM en los archivos de código fuente, por ejemplo binutils de GNU.

    
respondido por el pipe
2

En el ARMv7-m, ARM que estoy buscando en la codificación T3 para la resta inmediata 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 línea de codificación con eso, junto con el # 8 inmediato.

Si nos fijamos en LDR (literal), la codificación es 0x4800 con un registro e inmediato. esta instrucción como se documenta hace una carga relativa de la PC, por lo que la PC está implícita. igualmente, 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, con 32 bits alineados no necesitamos los dos bits más bajos que queman el espacio de instrucciones, por lo que 1101 es un 0x0D que da 0x490D como la codificación.

Todo está allí mismo en el documento que está viendo.

    
respondido por el old_timer
1

enlace

490D: el '4' = 0100 y el '9' = 1001, por lo que los cinco bits superiores son 01001. Mirar hacia abajo en la tabla muestra eso 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.

    
respondido por el pjc50

Lea otras preguntas en las etiquetas