Table of Contents
- 1 — ARM Assembly “clássico” vs Thumb: o que realmente muda
- 2 — Arquiteturas de instruções nos Cortex-M: ARMv6-M, ARMv7-M, ARMv8-M e ARMv8.1-M
- 3 — Thumb-2 na prática: pipeline, fetch de instruções e impacto em desempenho e energia
- 4 — Exemplo prático: “Hello World” em assembly para Cortex-M3 com UART hipotética
1 — ARM Assembly “clássico” vs Thumb: o que realmente muda
Quando falamos em assembly ARM, é comum misturar dois conceitos que, embora relacionados, têm impactos profundos no projeto de firmware: o conjunto de instruções ARM “clássico” (ARM state) e o conjunto de instruções Thumb (Thumb state). Historicamente, o ARM clássico utiliza instruções de 32 bits de largura fixa, enquanto o Thumb surgiu como uma alternativa mais compacta, inicialmente com instruções de 16 bits, visando reduzir o tamanho do código em memória — algo crítico em microcontroladores.

No ARM clássico, cada instrução de 32 bits carrega bastante informação: operação, registradores envolvidos, modos de endereçamento e, em muitas instruções, condicionalidade embutida (flags como EQ, NE, GT, LT diretamente no opcode). Isso resulta em código expressivo e eficiente em termos de ciclos por instrução, mas com custo direto em consumo de Flash e largura de banda de barramento. Esse modelo fez muito sentido em CPUs com cache e memória abundante, como aplicações embarcadas de maior porte ou sistemas operacionais completos.
O Thumb, por outro lado, nasceu com uma proposta pragmática: densidade de código. Ao reduzir o tamanho das instruções, o processador consegue armazenar mais lógica no mesmo espaço de memória, além de melhorar o fetch em barramentos estreitos. A contrapartida inicial era um conjunto de instruções mais restrito, menos modos de endereçamento e menor flexibilidade em certas operações. Com o tempo, essa limitação foi sendo superada, culminando no Thumb-2, que combina instruções de 16 e 32 bits de forma transparente, mantendo alta densidade de código sem sacrificar capacidade expressiva.
É aqui que entra um ponto essencial para quem trabalha com microcontroladores da família ARM Cortex-M: não existe “ARM clássico” nesses núcleos. Todos os Cortex-M executam exclusivamente Thumb/Thumb-2. Isso não é um detalhe de implementação, mas uma decisão arquitetural profunda: simplifica o pipeline, reduz consumo de energia, elimina a necessidade de alternância de estado ARM/Thumb e torna o comportamento mais previsível — algo fundamental para sistemas de tempo real.

Portanto, ao escrever assembly para Cortex-M, falar em “assembly ARM” significa, na prática, assembly Thumb-2, ainda que a sintaxe seja parecida e muitos manuais usem o termo ARM de forma genérica. Entender essa diferença evita confusões comuns, como procurar instruções que simplesmente não existem nesse ambiente ou tentar aplicar modelos mentais válidos para Cortex-A/R em um núcleo projetado desde o início para microcontroladores determinísticos.