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

  1. Instruções de Comparação e Teste
  2. Instrução CMP
  3. Instrução CMN
  4. Instrução TEQ
  5. Instrução TST

As instruções de comparação comparam valores em registradores e valores imediatos e atualizam as flags de status do CPSR acordo com o resultado. Internamente, uma operação de subtração/adição é realizada, porém o resultado é descartado.

As instruções de teste comparam registradores e atualizam as flags de status do CPSR acordo com o resultado. Internamente, operações de lógicas E ou OU Exclusivo são realizadas, tendo o resultado é descartado.

As instruções são executadas de acordo com sufixo <cond> utilizado. As flags de status N, Z, C, e V são alteradas quando o sufixo S é utilizado em uma instrução.

As flags são utilizadas na tomada de decisão quando usadas em conjunto com as instruções de Controle de Fluxo.

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

Notação utilizada
opcode/Mnemônico Instrução
<- Atribuição
Rn, Rm Registrador operando
[] Conteúdo/Conteúdo de memória
MEM Memória
cond Condição
AND, EOR E, Ou Exclusivo

Com a instrução CMP, que utilizando um operação de subtração, podemos comparar registradores ou registrador e valor imediato . As flags N, Z, C e V são alteradas de acordo com o resultado. A Carry tem o mesmo comportamento da subtração.

Sintaxe:
CMP{<cond>} Rn, <endereçamento>
Operação:
Resultado <- Rn - <endereçamento>
N, Z, C, V <- Resultado
Endereçamento:
#<imediato>
Rm
Rm, LSL #<deslocamento_imediato>
Rm, LSL Rs
Rm, LSR #<deslocamento_imediato>
Rm, LSR Rs
Rm, ASR #<deslocamento_imediato>
Rm, ASR Rs
Rm, ROR #<deslocamento_imediato>
Rm, ROR Rs
Rm, RRX
CPSR:
N: a
Z: a
C: a 
V: a 
Ex:
CMP R0, R2
CMP R1, #FF00FF00

A instrução CMN compara valores de forma semelhante à instrução CMP, porém utiliza um operação de adição que é usada internamente. As flags N, Z, C e V são alteradas de acordo com o resultado.

Sintaxe:
CMN{<cond>} Rn, <endereçamento>
Operação:
Resultado <- Rn + <endereçamento>
N, Z, C, V <- Resultado
Endereçamento:
#<imediato>
Rm
Rm, LSL #<deslocamento_imediato>
Rm, LSL Rs
Rm, LSR #<deslocamento_imediato>
Rm, LSR Rs
Rm, ASR #<deslocamento_imediato>
Rm, ASR Rs
Rm, ROR #<deslocamento_imediato>
Rm, ROR Rs
Rm, RRX
CPSR:
N: a
Z: a
C: a
V: a 
Ex:
CMN R0, R2
CMN R1, #FF00FF00

Usando a instrução TEQ podemos verificar se dois valores/registradores são iguais sem que a flag Overflow seja afetada. Internamente, uma operação bit-a-bit OU Exclusivo(EOR) é feita. As flags N, C e Z são atualizadas com base no resultado.

Sintaxe:
TEQ{<cond>} Rn, <endereçamento>
Operação:
Resultado <- Rn EOR <endereçamento>
N, Z  <- Resultado
C <- Carry_endereçamento
Endereçamento:
#<imediato>
Rm
Rm, LSL #<deslocamento_imediato>
Rm, LSL Rs
Rm, LSR #<deslocamento_imediato>
Rm, LSR Rs
Rm, ASR #<deslocamento_imediato>
Rm, ASR Rs
Rm, ROR #<deslocamento_imediato>
Rm, ROR Rs
Rm, RRX
CPSR:
N: a
Z: a
C: a
V: -
Ex:
MOV R1, #0000FFFF
TEQ R0, R1 LSL #16

Com a instrução TST podemos verificar se alguns bits de um registrador estão setados ou não. Internamente, uma operação bitwise/bit-a-bit E(AND) é feita e as flags N, C e Z são atualizadas de acordo com o resultado.

Sintaxe:
TST{<cond>} Rn, <endereçamento>
Operação:
Resultado <- Rn EOR <endereçamento>
N, Z <- Resultado
C <- Carry_endereçamento
Endereçamento:
#<imediato>
Rm
Rm, LSL #<deslocamento_imediato>
Rm, LSL Rs
Rm, LSR #<deslocamento_imediato>
Rm, LSR Rs
Rm, ASR #<deslocamento_imediato>
Rm, ASR Rs
Rm, ROR #<deslocamento_imediato>
Rm, ROR Rs
Rm, RRX
CPSR:
N: a
Z: a
C: a
V: -
Ex:
MOV R1, #0000FFFF
TST R0, R1
  1. 05/02/2025 - versão inicial