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

  1. Instruções de Comparação
  2. Instrução CMP
  3. Instrução CMPSB
  4. Instrução CMPWB
  5. Instrução SCASB
  6. Instrução SCASW
  7. Prefixo REPZ
  8. Prefixo REPNZ

As instruções de comparação comparam registradores e/ou valores de memória e setam as flags de status acordo com o resultado. Internamente, uma operação de subtração é realizada, porém o resultado é descartado.

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

Mais informações sobre registradores e flags podem ser vistas em Registradores e Flags.

Notação utilizada:
REG Registrador de uso geral
SREG Registrador de segmento
MEM Endereço de memória
IME Valor imediato
; Comentário
O, Z, N, S, P, Cy Flags
<- Atribuição
Flags
a Alterada de acordo com resultado
- Não sofre alteração
0 Sempre zero
1 Sempre um

Com a instrução CMP podemos comparar registradores ou valores em memória. As flags O, S, Z, P , Cy e Ac são alteradas de acordo com o resultado.

Operação:
Resultado <- Operando1 - Operando2
O, S, Z, Ac, P, Cy <- Resultado
Operandos:
REG, MEM
MEM, REG
REG, REG
MEM, IME
REG, IME
F(Flags)
O: a
S: a
Z: a 
Ac:a 
P: a
Cy:a
Ex:
MOV AL, 1
MOV CL, 1
CMP AL, CL  
;Resultado = 0, Z <- 1

Com a instrução CMPSB podemos comparar bytes de forma sequencial em memória. O primeiro operando é recuperado a partir de DS:[SI] e o segundo operando, para comparação, é recuperado a partir de ES:[DI]. A flag D é utilizado para definir a direção em que a comparação é feita.

Operação:
DS:[SI] - ES:[DI]
O, S, Z, Ac, P, Cy alteradas

Flag D = 0 
     SI <- SI + 1
     DI <- DI + 1
Flag D = 1
     SI <- SI - 1
     DI <- DI - 1
Operandos:
REG, MEM
MEM, REG
REG, REG
MEM, IME
REG, IME
F(Flags)
O: a
S: a
Z: a 
Ac:a
P: a
Cy:a
Ex:

MOV     AX, CS
MOV     DS, AX      ;Seta regs. de segmento
MOV     ES, AX
LEA     SI, vetor1  ; operando1
LEA     DI, vetor2m ; operando2
MOV     CX, 4       ; qtd bytes
CLD
REPE    CMPSB       ; comparação

; tratamento não igual

loop:
JMP loop

vetor1 db 1, 2, 3, 4
vetor2 db 1, 2, 3, 4

Semelhante à CMPSB, porém, a instrução CMPSW compara words de forma sequencial em memória. O primeiro operando é recuperado a partir de DS:[SI] e o segundo operando, para comparação, é recuperado a partir de ES:[DI]. A flag D é utilizado para definir a direção.

Operação:
DS:[SI] - ES:[DI]
O, S, Z, Ac, P, Cy alteradas

Flag D = 0 
     SI <- SI + 2
     DI <- DI + 2
Flag D = 1
     SI <- SI - 2
     DI <- DI - 2
Operandos:
-
F(Flags)
O: a
S: a
Z: a 
Ac:a
P: a
Cy:a
Ex:
MOV     AX, CS
MOV     DS, AX      ;Seta regs. de segmento
MOV     ES, AX
LEA     SI, vetor1  ; operando1
LEA     DI, vetor2 ; operando2
MOV     CX, 4       ; qtd bytes
CLD
REPE    CMPSW       ; comparação

; tratamento não igual

loop:
JMP loop

vetor1 dw 1, 2, 3, 4
vetor2 dw 1, 2, 3, 4

Com a instrução SCASB podemos comparar bytes em memória, contidos em ES:[SI], com um valor contido no registrador AL. A flag D é utilizado para definir a direção.

Operação
AL - ES:[SI]
O, S, Z, Ac, P, Cy alteradas

Flag D = 0 
     SI <- SI + 1
Flag D = 1
     SI <- SI - 1
Operandos:
-
F(Flags)
O: a
S: a
Z: a 
Ac:a 
P: a
Cy:a
Ex:
MOV     AX, CS
MOV     DS, AX      ;Seta regs. de segmento
MOV     ES, AX
LEA     SI, vetor1  ; operando1
MOV     CX, 4       ; qtd bytes
CLD
MOV     AL, 1
REPE    SCASB       ; comparação

; tratamento não igual

loop:
JMP loop

vetor1 db 1, 1, 1, 1

Semelhante à SCASB, a instrução SCASW compara um words em memória, contidas em ES:[SI], com um valor armazenado no registrador AX. A flag D é utilizado para definir a direção.

Operação
AX - ES:[SI]
O, S, Z, Ac, P, Cy alteradas

Flag D = 0 
     SI <- SI + 2
Flag D = 1
     SI <- SI - 2
Operandos:
-
F(Flags)
O: a
S: a
Z: a 
Ac:a 
P: a
Cy:a
Ex:
MOV     AX, CS
MOV     DS, AX      ;Seta regs. de segmento
MOV     ES, AX
LEA     SI, vetor1  ; operando1
MOV     CX, 4       ; qtd bytes
CLD
MOV     AX, 1
REPE    SCASW       ; comparação

; tratamento não igual

loop:
JMP loop

vetor1 dw 1, 1, 1, 1

O prefixo REPE/Z repete, enquanto flag Z == 1, uma das instruções CMPSB, CMPSW, SCASB, SCASW baseado no registrador CX que é usado como contador.

Operação
enquanto CX > 0
    CX <- CX - 1
    se Z == 1
	    executa instrução
    se Z == 0 
        fim
fim
Operandos:
REPZ nome_instrucao
F(Flags)
O: -
S: -
Z: 1 se CX == 0, 0 caso contrário
Ac:-
P: -
Cy:-
Exemplo:
MOV DI, FF00h
MOV SI, EE00h
MOV CX, 5
REPZ CMPSB

O prefixo REPNE/NZ repete, enquanto flag Z == 0, uma das instruções CMPSB, CMPSW, SCASB, SCASW baseado no registrador CX que é usado como contador.

Operação
enquanto CX > 0
    CX <- CX - 1
    se Z == 1
	    executa instrução
    se Z == 0 
        fim
fim
Operandos:
REPNZ nome_instrucao
F(Flags)
O: -
S: -
Z: 1 se CX == 0, 0 caso contrário
Ac:-
P: -
Cy:-
Exemplo:
MOV DI, FF00h
MOV SI, EE00h
MOV CX, 5
REPNZ CMPSB
  1. 21/01/2026 - revisão 2 - Adição: prefixos repz e repnz
  2. 18/02/2025 - revisão 1 - ajustes pontuais
  3. 09/12/2024 - versão inicial