El conjunto de instrucciones ARM es muy poderoso, y una única instrucción ARM puede hacer algunas combinaciones de cosas que requerirían múltiples instrucciones al usar muchos otros conjuntos de instrucciones. Sin embargo, este poder tiene un costo: cada instrucción ARM necesita cuatro bytes para almacenarse; mientras que las instrucciones ARM pueden en promedio hacer un "trabajo" algo más útil de lo que sería posible con una instrucción de dos bytes, no hacen el doble. Además, en una aplicación típica habrá secciones del código que necesitarán instrucciones más poderosas, pero también habrá secciones grandes del código que recibirán relativamente poco beneficio de ellas.
El propósito original del conjunto de instrucciones Thumb no era servir como una alternativa completa a ARM, sino permitir que las partes de la aplicación que necesitan las instrucciones más poderosas las usen, mientras que las partes que no lo hacen Necesito que esas instrucciones se puedan almacenar de forma más compacta. Incluso si el 90% de un programa está escrito en modo Thumb, esa parte puede llamar fácilmente a una subrutina escrita en modo ARM si necesita hacer algo en el modo ARM. En consecuencia, los diseñadores tenían la libertad de omitir de las instrucciones del modo Pulgar, que establecen ciertas operaciones que la mayoría de las aplicaciones no tendrían que realizar muy a menudo, incluso si las aplicaciones tuvieran que hacerlo en algún momento.
En sus últimos núcleos, ARM se ha alejado del diseño de dos modos, yendo en dos direcciones diferentes. Algunos núcleos como el Cortex-M3 usan solo un modo de instrucción de 16 bits, pero usan algunos patrones de instrucción de 16 bits que de otra manera no se usan para representar la primera mitad de una instrucción de dos palabras. Esto hace que la mayoría de las instrucciones ARM estén disponibles incluso en el modo de 16 bits. Otros núcleos como el Cortex-M0 se limitan principalmente al conjunto de instrucciones original del pulgar, pero aumentarlo con instrucciones adicionales suficientes para que sea posible hacer las cosas que de otro modo habrían requerido cambiar al modo ARM.
Personalmente, estoy un poco triste al ver que se abandona el modo ARM. Si bien el enfoque de Cortex-M3 funciona casi igual de bien, el modo ARM podría hacer algunas cosas que Cortex-M3 no puede hacer tan bien. Por ejemplo, en el modo ARM cada instrucción tenía un campo de "condición" que causaría que se ejecutara solo si se establecían ciertos indicadores. Esto hizo posible hacer ciertos tipos de código de permutación de bits usando tres instrucciones por cada dos bits.
; Capture bits 2 and 3 of R0 in sign and carry flags, respectively
movs r0,r0,rol #29
orrmi r4,r4,#128 ; Set bit 7 of R4 if bit 2 of R0 was set
orrcs r5,r5,#128 ; Set bit 7 of R5 if bit 3 of R0 was set
El Cortex-M3 tiene una instrucción "if-then-else" bastante poderosa que se puede usar para hacer que la ejecución de las siguientes instrucciones sea condicional en función de las banderas, y tiene modos para, p. ej. "ejecutar la siguiente instrucción solo si se configura el acarreo, y la siguiente solo si está claro", pero todas las instrucciones controladas por una instrucción particular "if-then-else" deben usar el mismo indicador de condición. En consecuencia, la secuencia de tres instrucciones anterior se convertiría en cinco.