Objetivos
Clique sobre os objetivos listados abaixo para navegar até o conteúdo desejado.
Instruções de coprocessador
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.
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. Essa exceção ser vista com mais informações em
Interrupções.
Em relação a compatibilidade, as instruções de coprocessador não estão presentes na ARMv1 e
podem ser sofrer alterações nas versões 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 |
MCR - Move to Coprocessor from ARM
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
MRC - Move to ARM from Coprocessor
Com o uso da instrução MRC podemos mover dados do coprocessador para o processador
principal. Essa pode ser 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
CDP - Coprocessor Data Processing
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]
Histórico de atualizações
- 18/05/2026 - revisão 1 - Ajustes: 'objetivos' , intro e ajuste pontuais em descrições
- 07/02/2025 - versão inicial
Os cursos oferecidos nesta página são cursos fornecidos por parceiros. Ao comprar um curso clicando
em seu banner, você está ajudando a manter o projeto TutorialDev vivo. Os sites dos cursos parceiros utilizam cookies.