¿Cuál es la diferencia entre las codificaciones de instrucciones ARM, Thumb y Thumb 2?


Estoy un poco confundido acerca de los conjuntos de instrucciones. Hay Pulgar, BRAZO y Pulgar 2. Por lo que he leído las instrucciones de pulgar son todas de 16 bits, pero dentro del manual de usuario ARMv7M (página vi) hay instrucciones de Pulgar de 16 bits y Pulgar de 32 bits mencionadas.

Ahora tengo que superar esta confusión. Se dice que Thumb 2 soporta instrucciones de 16 bits y 32 bits. Entonces, ¿ARMv7M es de hecho compatible con las instrucciones del Pulgar 2 y no solo con el pulgar?

Una cosa más. Puedo decir que Thumb (32-bit) es lo mismo que las instrucciones ARM que son allso 32-bit?

 25

2 answers

Oh, ARM y su tonto nombre...

Es un error común, pero oficialmente no hay tal cosa como un "conjunto de instrucciones Pulgar-2".

Ignorando ARMv8 (donde todo es renombrado y AArch64 complica las cosas), de ARMv4T a ARMv7-A hay dos conjuntos de instrucciones: BRAZO y Pulgar. Ambos son" 32 bits " en el sentido de que operan en datos de hasta 32 bits de ancho en registros de 32 bits de ancho con direcciones de 32 bits. De hecho, donde se superponen representan la exactamente las mismas instrucciones - es solo la instrucción codificación que difiere, y la CPU efectivamente solo tiene dos diferentes decodificar front-ends a su canalización que puede cambiar entre. Para mayor claridad, ahora evitaré deliberadamente los términos "32 bits"y" 16 bits"...

Las instrucciones ARM tienen codificaciones de 4 bytes de ancho fijo que requieren alineación de 4 bytes. Las instrucciones del pulgar tienen codificaciones de longitud variable (2 o 4 bytes, ahora conocidas como "estrechas" y "anchas") que requieren alineación de 2 bytes - la mayoría de las instrucciones tienen codificaciones de 2 bytes, pero bl y blx siempre han tenido codificaciones de 4 bytes*. La parte realmente confusa vino en ARMv6T2, que introdujo la "tecnología Thumb-2". Thumb-2 abarcó no solo agregar una carga más instrucciones a Thumb (principalmente con codificaciones de 4 bytes) para llevarlo casi a la paridad con ARM, sino también extender el estado de ejecución para permitir la ejecución condicional de la mayoría de las instrucciones Thumb, y finalmente introducir una sintaxis de ensamblado completamente nueva (UAL, " Unified Lenguaje ensamblador") que reemplazó las anteriores sintaxis de BRAZO y Pulgar separadas y permitió escribir código una vez y ensamblarlo en cualquiera de los conjuntos de instrucciones sin modificación.

Las arquitecturas Cortex-M solo implementan el conjunto de instrucciones Thumb-ARMv7-M (Cortex-M3/M4/M7) soporta la mayor parte de la "Tecnología Thumb-2", incluyendo la ejecución condicional y codificaciones para instrucciones VFP, mientras que ARMv6-M (Cortex-M0 / M0+) solo usa Thumb-2 en forma de un puñado de sistema de 4 bytes instrucción.

Por lo tanto, las nuevas codificaciones de 4 bytes (y las agregadas más tarde en las revisiones de ARMv7) siguen siendo Instrucciones de pulgar-el aspecto "Pulgar - 2" de ellas es que pueden tener codificaciones de 4 bytes, y que pueden (en su mayoría) ser ejecutadas condicionalmente a través de it (y, supongo, que sus menmonics solo se definen en UAL).

* Antes de ARMv6T2, en realidad era un detalle de implementación complicado en cuanto a si bl (o blx) se ejecutaba como un 4-byte instrucción o como un par de instrucciones de 2 bytes. La definición arquitectónica era la última, pero dado que solo podían ejecutarse como un par en secuencia, había poco que perder (aparte de la capacidad de tomar una interrupción a mitad de camino) fusionándolos en una sola instrucción por razones de rendimiento. ARMv6T2 acaba de redefinir las cosas en términos de la ejecución de una sola instrucción fusionada

 45
Author: Notlikethat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-26 10:08:08

Además de No como la respuesta de , y como sugiere, ARMv8 introduce una nueva terminología para tratar de reducir la confusión (por supuesto, agregando aún más terminología nueva):

Hay un estado de ejecución de 32 bits (AArch32) y un estado de ejecución de 64 bits (AArch64).

El estado de ejecución de 32 bits admite dos conjuntos de instrucciones diferentes: T32 ("Thumb") y A32 ("ARM"). El estado de ejecución de 64 bits solo admite un conjunto de instrucciones: A64.

Todos los A64, como todos los A32, las instrucciones tienen un tamaño de 32 bits (4 bytes), lo que requiere una alineación de 4 bytes.

Muchas/la mayoría de las instrucciones A64 pueden operar tanto en registros de 32 bits como de 64 bits (o posiblemente vistas de 32 bits o 64 bits del mismo registro subyacente de 64 bits).

Todos los procesadores ARMv8 (como todos los procesadores ARMv7) admiten instrucciones Thumb-2 en el conjunto de instrucciones T32.

 10
Author: unixsmurf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:42