Clique sobre os objetivos listados abaixo para navegar até o conteúdo desejado.

A arquitetura ARM define instruções para comunicação com coprocessadores, de forma independente de memória e registradores do processador ARM principal, para realizar operações não presentes nessa arquitetura.

A ARM define que até 16 coprocessadores podem ser utilizados, sendo identificados pelos números 0 a 15. Um coprocessador pode utilizar mais de um desses números dependendo da complexidade. Opcodes e registradores de entrada/origem e saída/destino são configuráveis como operandos para a comunicação.

Caso um coprocessador não possa responder as instruções de comunicação, um exceção UNDEFINED será gerada/lançada. O exceção UNDEFINED pode ser vista em Interrupções.

Em relação a compatibilidade, as instruções de coprocessador não estão presentes na ARM v1 e podem ser sofrer alterações em v4+, sendo estendidas com novas instruções.

As instruções de coprocessador são executadas de acordo com a condição <cond> utilizada, mas não possuem suporte ao sufixo S.

Mais informações sobre registradores, flags e condições podem ser vistas em Registradores e CPSR e Formato: Condições.

Notação utilizada:
MEM Endereço de memória
[] Conteúdo de memória
<- Atribuição

Ao usarmos a instrução MCR, movemos um valor ou dado para um coprocessador. Essa instrução pode ser utilizada para iniciar um coprocessador que realiza operações sobre os registradores do processador principal.

Sintaxe
MCR{<cond>} p<cp#>, <coopcode_1>, Rd, CRn, CRm, <coopcode_2>
Onde
cp#: número do coprocessador
coopcode_N: código da operação do coprocessador
Rd: registrador de destino do processador
CRn: registrador operando1 do processador
CRm: registrador operando2 do processador
Endereçamento:
-
CPSR
N: -
Z: -
C: -
V: -
Ex:
MOV R1, #AA
MOV R2, #BB
MCR p1, 1, R0, c1, c2, 3

Com o uso da instrução MRC, podemos mover dados do coprocessador para o processador principal. Essa pode seru utilizada para iniciar um coprocessador que retorna valores para os registradores do processador principal.

Sintaxe
MCR{<cond>} p<cp#>, <coopcode_1>, Rd, CRn, CRm, <coopcode_2>
Onde
cp#: número do coprocessador
coopcode_N: código da operação do coprocessador
CRd: registrador de destino do processador
CRn: registrador operando1 do processador
CRm: registrador operando2 do processador
Endereçamento:
-
CPSR
N: -
Z: -
C: -
V: -
Ex:
MOV R1, #AA
MOV R2, #BB
MCR p1, 1, R0, c1, c2, 3

Ao usar a instrução CDP informamos a um coprocessador para realizar uma operação que envolve o processamento de um dado, valor ou endereço que é passado como argumento.

Sintaxe
CDP{<cond>} pl&cp#>, <coopcode_1>, CRd, CRn, CRm, <coopcode_2>
Onde
cp#: número do coprocessador
coopcode_N: código da operação do coprocessador
CRd: registrador de destino do processador
CRn: registrador operando1 do processador
CRm: registrador operando2 do processador
Endereçamento:
-
CPSR
N: -
Z: -
C: -
V: -
Ex:
MOV R0, #8 ; dividendo
MOV R1, #4 ; divisor
MOV R2, #0 ; resultado
CDP p1, 1, C0, c1, c2, 3

Fazendo uso da instrução LDC, podemos informar a um coprocessador que estamos passando um valor em memória como argumentos para o coprocessamento.

Sintaxe
LDC{<cond>} p<cp#> <endereçamento>
Onde
cp#: número do coprocessador
coopcode_N: código da operação do coprocessador
CRd: registrador de destino do processador
Endereçamento:
CRd, [Rn,#+/-(<8_bit_offset>*4)]
CRd, [Rn,#+/-(<8_bit_offset>*4)]!
CRd, [Rn],#+/-(<8_bit_offset>*4)
CPSR
N: -
Z: -
C: -
V: -
Ex:
MOV R0, #FF00FF00
MOV R12, #40000000;
STR R0, [R12]
LDC p1, CR0, [R12]

Usando a instrução STC, podemos armazenar dados coprocessados na memória do processsador principal. O coprocessador produz os dados previamente e aguarda a leitura pelo processador.

Sintaxe
STC{<cond>} p<cp#>, <endereçamento>
Onde
cp#: número do coprocessador
CRd: registrador de destino do processador
Endereçamento:
CRd, [Rn,#+/-(<8_bit_offset>*4)]
CRd, [Rn,#+/-(<8_bit_offset>*4)]!
CRd, [Rn],#+/-(<8_bit_offset>*4)
CPSR
N: -
Z: -
C: -
V: -
Ex:
MOV R0, #FF00FF00
MOV R12, #40000000;
STR R0, [R12]
LDC p1, CR0, [R12]
  1. 07/02/2025 - versão inicial