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.

Last updated