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.
Exemplo:
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.
Além das condições acima existem mais três Jcc
que testam o valor do registrador CX, ECX e RCX respectivamente.
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.
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
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