MCU & FPGA Linguagem Assembly ARM vs Thumb: Arquitetura de Instruções nos Cortex-M e Exemplo Prático em Assembly

Assembly ARM vs Thumb: Arquitetura de Instruções nos Cortex-M e Exemplo Prático em Assembly


2 — Arquiteturas de instruções nos Cortex-M: ARMv6-M, ARMv7-M, ARMv8-M e ARMv8.1-M

Embora todos os microcontroladores Cortex-M executem exclusivamente Thumb/Thumb-2, o conjunto exato de instruções disponíveis varia significativamente conforme a versão da arquitetura ARMvX-M adotada pelo núcleo. Essa distinção é frequentemente ignorada, mas ela explica por que um mesmo código assembly compila para um Cortex-M3 e falha em um Cortex-M0, ou por que certos recursos de depuração e segurança simplesmente não existem em núcleos mais simples.

A ARMv6-M representa a base da família Cortex-M, utilizada em núcleos como M0 e M0+. Aqui encontramos apenas o subconjunto Thumb de 16 bits, com instruções intencionalmente simples. Não há divisão por hardware, não há instruções DSP, não existem acessos avançados de múltiplos registradores e o modelo de exceções é reduzido. Essa arquitetura foi pensada para baixo custo, baixo consumo e extrema previsibilidade, sacrificando expressividade em prol de simplicidade. Para quem escreve assembly, isso significa trabalhar com um repertório enxuto, onde cada instrução precisa ser escolhida com cuidado.

A ARMv7-M, introduzida com o Cortex-M3 e estendida no M4 e M7, marca um salto qualitativo importante. Ela introduz o Thumb-2 completo, permitindo a mistura de instruções de 16 e 32 bits, o que amplia drasticamente as possibilidades de codificação sem perder densidade. Surgem instruções de multiplicação mais ricas, manipulação eficiente de pilha, acesso a múltiplos registradores e um sistema de exceções mais robusto. Nos M4 e M7, essa arquitetura é estendida com instruções DSP e, opcionalmente, FPU (Floating Point Unit), o que muda completamente o perfil de aplicações possíveis, especialmente em controle, processamento de sinais e automação.

Com a ARMv8-M, a arquitetura Cortex-M passa a incorporar preocupações modernas de segurança, sem abandonar o foco em sistemas embarcados determinísticos. Além de manter compatibilidade com ARMv7-M no que diz respeito ao Thumb-2, surge o conceito de domínios seguros e não seguros, viabilizado pelo TrustZone para microcontroladores. Do ponto de vista do assembly, isso introduz novas instruções e regras relacionadas à troca de contexto seguro, validação de chamadas e separação de memória. O programador passa a lidar não apenas com registradores e pilha, mas também com fronteiras de confiança definidas em hardware.

A evolução natural dessa linha é a ARMv8.1-M, que refina o modelo de segurança e adiciona extensões voltadas a confiabilidade funcional e sistemas críticos, mantendo compatibilidade binária com ARMv8-M sempre que possível. Essa arquitetura é particularmente relevante em aplicações industriais, automotivas e médicas, onde requisitos como isolamento, previsibilidade temporal e certificação são tão importantes quanto desempenho bruto.

Em resumo, todas essas arquiteturas compartilham a filosofia Thumb, mas diferem profundamente em capacidade expressiva, complexidade do conjunto de instruções e modelo de execução. Entender essa progressão é essencial para escrever código portátil, escolher corretamente um microcontrolador para um projeto e, principalmente, para compreender por que certos exemplos de assembly “simples” funcionam em um Cortex-M3, mas são impossíveis em um Cortex-M0.

Related Post