> For the complete documentation index, see [llms.txt](https://bit-by-bit.gitbook.io/embedded-systems/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bit-by-bit.gitbook.io/embedded-systems/processadores-cortex-m0+/arquitetura-do-conjunto-de-instrucoes-isa.md).

# Arquitetura do Conjunto de Instruções (ISA)

Possui conjunto de instruções simples com 56 instruções. De modo geral, é um subconjunto Thumb (do inglês, *Thumb Instruction Set Architecture*) que inclui a tecnologia [Thumb-2](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/ch01s02s01.html) \[3]. A maioria das instruções são de 16 bits, as demais possuem 32 bits. Embora possua instruções com tamanhos diferentes, ainda é classificado como RISC (do inglês, *Reduced Instruction Set Computing*) \[2].

De fato, a operações *load-store* podem aumentar a quantidade de instruções utilizadas para realizar um determinado procedimento. No entanto, o tamanho das instruções e as operações realizadas ainda garantem alta densidade de código \[2,3].

Embora simples, o conjunto de instruções aumenta aproximadamente 30% a densidade de código. Isso, é claro, afeta o desempenho, sendo 20% menor que um código composto somente por instruções ARM \[2].

## Conjunto de Instruções

A seguir são destacadas as instruções de 16 bits do subconjunto Thumb. É importante destacar que o conjunto de instruções Thumb é subconjunto de instruções ARM (32 bits). Para conferir todas operações realizadas na execução das instruções, consulte esta referência: [The Cortex-M0+ Instruction Set](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0419c/index.html).

* Load-Store: LDM LDR LDRH LDRSH LDRB LDRSB STR STRH STRB STM;
* Movimentação de dados entre registradores: MOV;
* Adição, Subtração e Multiplicação: ADC ADD ADR SUB RSB SBC MUL;
* Lógica: AND, EOR, ORR, BIC, TST, MVN;
* Deslocamento e Rotação: ASR LSL LSR ROR;
* Operações de pilha: POP PUSH;
* Desvio: B BX BLX;
* Comparação: CMN CMP;
* Extensão de bits: SXTB SXTH UXTB UXTH;
* Swap: REV REV16 REVSH;
* Hint: SEV WFE WFI YIELD NOP BKPT;
* Alteração de estado: CPS SVC.

**Instruções de 32 bits**

* Barriers: DSB DMB ISB;
* Desvio: BL;
* Alteração de estado: MRS;
* Hint: MSR.

{% hint style="info" %}
***Barriers:** Instruções que ordenam a CPU a executar as operações iniciadas antes de prosseguir com as instruções subsequentes.*
{% endhint %}

{% hint style="info" %}
***Hint:** Instruções que notificam o processador sobre determinado estado.Por exemplo, a instrução YELD sinaliza que o contexto atual está pode ser trocado. Assim o processador pode tomar a ação de alterar o contexto. Já a instrução WFI faz com que o processador entre em modo sleep até que ocorra um evento.*
{% endhint %}

## Ciclo de Instrução

O ciclo de instrução é executado por um pipeline de dois estágios. Tal característica implica na redução de elementos de memória e consequentemente no consumo de energia \[1].

{% hint style="info" %}
***Pipeline:** O pipeline é caracterizado por permitir que o ciclo de instrução seja realizado em série para mais de uma instrução. Para tal, o ciclo de instrução é dividido em estágio. No caso de dois estágios, uma instrução é buscada na memória ao mesmo tempo que a atual está sendo executada.*
{% endhint %}

![](https://www.embarcados.com.br/wp-content/uploads/2018/07/Pipeline.png)

O pipeline contribui para o desempenho do sistema, pois reduz em um ciclo de clock a penalidade de instruções de desvio. Isto é, se uma instrução de desvio é executada, somente a instrução subsequente é ignorada (2 estágios).
