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:
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.
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.
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!
tubo
yildizabdullah
pjc50
yildizabdullah
viejo contador de tiempo
yildizabdullah
pjc50
viejo contador de tiempo
viejo contador de tiempo
viejo contador de tiempo
viejo contador de tiempo