Aprendendo Assembly
Doar para o autor
  • Introdução
  • Conteúdo
  • Como usar este livro
  • A base
    • Noção geral da arquitetura
    • Modos de operação
    • Sintaxe
    • Registradores de propósito geral
    • Endereçamento
    • Pilha
    • Saltos
    • Procedimentos
    • Seções e símbolos
    • Instruções assembly x86
    • Instruções do NASM
    • Pré-processador do NASM
    • Syscall no Linux
    • Olá mundo no Linux
    • Revisão
  • Aprofundando em Assembly
    • Registradores de segmento
    • CALL e RET
    • Position-independent executable
    • Atributos
    • Prefixos
    • Flags do processador
    • Instruções condicionais
    • Programando no MS-DOS
    • Interrupções de software e exceções
    • Procedimentos do BIOS
    • Usando instruções da FPU
    • Entendendo SSE
      • Instruções de movimentação de dados
      • Instruções aritméticas
      • Instruções lógicas e de comparação
      • Instruções com inteiros 128-bit
      • Instruções de conversão
  • Programando junto com C
    • Sintaxe do GAS
    • Convenção de chamada da System V ABI
    • Convenções de chamada no Windows
    • Variáveis em C
    • Funções em C
    • Ambiente hosted
    • Ambiente freestanding
    • Inline Assembly no GCC
    • Instruções intrínsecas
  • Depuração de código
    • Entendendo os depuradores
    • Depurando com o GDB
    • Depurando com o Dosbox
  • Apêndices
    • Código de máquina
      • Formato das instruções
      • Atributos e prefixos
      • Immediate
      • Displacement
      • ModR/M e SIB
      • Opcode
      • Prefixo REX
      • Codificação dos registradores
  • Metadados
    • TO DO
    • Referências
Powered by GitBook
On this page

Was this helpful?

Export as PDF
  1. Aprofundando em Assembly

Instruções condicionais

Entendendo as instruções condicionais e as status flags.

As instruções condicionais basicamente avaliam as status flags para executar uma operação apenas se a condição for atendida. Existem condições que testam o valor de mais de uma flag em combinação para casos diferentes.

A nomenclatura de escrita de uma instrução condicional é o seu nome seguido de um 'cc' que é sigla para conditional code. Abaixo uma tabela de códigos condicionais válidos para as instruções CMOVcc, SETcc e Jcc:

Os termos "abaixo" (below) e "acima" (above) usados na descrição se referem a verificação de um valor numérico não-sinalizado. Enquanto "maior" e "menor" é usado para se referir a um valor numérico sinalizado.

cc

Descrição (inglês | português)

Condição

A

if Above | se acima

CF=0 e ZF=0

AE

if Above or Equal | se acima ou igual

CF=0

B

if Below | se abaixo

CF=1

BE

if Below or Equal | se acima ou igual

CF=1 ou ZF=1

C

if Carry | se carry flag estiver setada

CF=1

E

if Equal | se igual

ZF=1

G

if Greater | se maior

ZF=0 e SF=OF

GE

if Greater or Equal | se maior ou igual

SF=OF

L

if Less | se menor

SF!=OF

LE

if Less or Equal | se menor ou igual

ZF=1 ou SF!=OF

NA

if Not Above | se não acima

CF=1 ou ZF=1

NAE

if Not Above or Equal | se não acima ou igual

CF=1

NB

if Not Below | se não abaixo

CF=0

NBE

if Not Below or Equal | se não abaixou ou igual

CF=0 e ZF=0

NC

if Not Carry | se carry flag não estiver setada

CF=0

NE

if Not Equal | se não igual

ZF=0

NG

if Not Greater | se não maior

ZF=1 ou SF!=OF

NGE

if Not Greater or Equal |se não maior ou igual

SF!=OF

NL

if Not Less | se não menor

SF=OF

NLE

if Not Less or Equal | se não menor ou igual

ZF=0 e SF=OF

NO

if Not Overflow | se não setado overflow flag

OF=0

NP

if Not Parity | se não setado parity flag

PF=0

NS

if Not Sign | se não setado sign flag

SF=0

NZ

if Not Zero | se não setado zero flag

ZF=0

O

if Overflow | se setado overflow flag

OF=1

P

if Parity | se setado parity flag

PF=1

PE

if Parity Even | se parity indica par

PF=1

PO

if Parity Odd | se parity indicar ímpar

PF=0

S

if Sign | se setado sign flag

SF=1

Z

if Zero | se setado zero flag

ZF=1

Exemplo:

cmp rax, rbx
jnz nao_igual  ; Salta se RAX e RBX não forem iguais

Repare como alguns cc têm a mesma condição, como é o caso de NE e NZ. Portanto JNE e JNZ são exatamente a mesma instrução no código de máquina, somente mudando no Assembly.

JCXZ e JECXZ

Além das condições acima existem mais três Jcc que testam o valor do registrador CX, ECX e RCX respectivamente.

Jcc

Descrição (inglês | português)

Condição

JCXZ

Jump if CX is zero | pula se CX for igual a zero

CX=0

JECXZ

Jump if ECX is zero |pula se ECX for igual a zero

ECX=0

JRCXZ

Jump if RCX is zero | pula se RCX for igual a zero

RCX=0

A última instrução, obviamente, somente existe em submodo de 64-bit. Enquanto JCXZ não existe em 64-bit.

No código de máquina o opcode dessa instrução é 0xE3 e a alternância entre o tamanho do registrador é feita de acordo com o atributo address-size, sendo modificado pelo prefixo 0x67.

PreviousFlags do processadorNextProgramando no MS-DOS

Last updated 3 years ago

Was this helpful?