Você está na página 1de 11

Assembly - Flags de Condição

e Instruções de Desvio

1
Fluxo de Execução em Assembly
• Normalmente, comandos em C e instruções de máquina
são executados sequencialmente
• Algumas construções em C (mecanismos de decisão e
repetição) requerem a quebra da execução sequencial
de instruções
– a sequência de operações executada depende do resultado de
testes aplicados aos dados  execução condicional
• A linguagem de máquina provê mecanismos básicos
para isso, permitindo
– testar valores de dados (resultado de operações aritméticas e
lógicas)
– alterar o fluxo de controle do programa conforme o resultado
desses testes
2
Testes sobre Dados
• A CPU mantém um conjunto de bits (EFLAGS) que
descreve o resultado da última operação
aritmética/lógica realizada
– INC/DEC, NEG, ADD/SUB/IMUL, NOT/AND/OR/XOR
– SAL, SHL, SAR, SHR
– TEST, CMP (teste e comparação)

• Esses bits (combinações específicas) podem ser usados


como condições para alterar o fluxo de controle
– qual a próxima instrução a ser executada

3
Alteração do fluxo de controle
• A ordem de execução de instruções pode ser alterada
com instruções de desvio (jumps)
– existem instruções de desvio condicional e incondicional

• Exemplo de jump condicional:


cmp %ebx, %eax  compara %eax e %ebx
jle L1  desvio se %eax <= %ebx

• A “condição” do jump se refere ao resultado da instrução


anterior (cmp)
– a condição “le” (<=) corresponde a uma combinação ZF/SF/OF

4
Flags de Condição
CF Carry Flag SF Sign Flag
ZF Zero Flag OF Overflow Flag

CF =1 unsigned overflow / shift


ZF = 1 resultado zero
SF = 1 resultado < 0
OF =1 overflow comp 2 -> carries diferentes

• Operações lógicas zeram CF e OF


• Operações de shift zeram OF

5
Teste e Comparação
• Instruções que não alteram seus operandos, só os flags
– comparações <, <=, ==, >, >= e testes com máscaras
– condições para testar as combinações dos flags

Instrução Baseada em Descrição


cmp S2 , S1 S1 - S2 compare
cmpb compare byte
cmpw compare word
cmpl compare long
test S2 , S1 S1 & S2 test
testb test byte
testw test word
testl test long
6
Exemplos
• testl %eax, %eax
– para testar se == 0  jz
– para testar se < 0, >=0  js, jns

• testl $0x01,%eax
– para testar se bit está setado  jnz

• cmp %ebx,%eax
– para testar se %eax == %ebx  je, jne

– para testar se %eax < %ebx  jb (unsigned)


jl (signed)
7
Instruções de Desvio
• Podem alterar a sequência de execução (“goto”)
• O destino do desvio é indicado no código assembly por
um “label simbólico” (jump direto)
– traduzido pelo assembler + linker para um endereço de memória

L1:
testl %ebx, %ebx
jz L2 // condicional
...
jmp L1 // incondicional
L2:
xorl %eax, %eax

8
Desvios Condicionais
Instrução Sinônimo Descrição
je Label jz equal/zero
jne Label jnz not equal/ not zero
js Label negative
jns Label non negative
jg Label jnle signed > (greater)
jge Label jnl signed >= (greater or equal)
jl Label jnge signed < (less)
jle Label jng signed <= (less or equal)
ja Label jnbe unsigned > (above)
jae Label jnb unsigned >= (above or equal)
jb Label jnae unsigned < (below)
jbe Label jna unsigned <= (below or equal)
9
Combinações de flags em
comparações
cmp s2,s1 é baseada em s1 - s2

• Interpretação do resultado com sinal: s1 < s2 se OF ≠ SF


– sem overflow: se s1 < s2 (jl)  resultado é < 0  OF = 0 e SF = 1
se s1 > s2 (jg)  resultado é > 0  OF = 0 e SF = 0
– com overflow: se s1 < s2 (jl)  resultado é > 0  OF = 1 e SF = 0
se s1 > s2 (jg)  resultado é < 0  OF = 1 e SF = 1
– jle  ZF = 1 ou OF ≠ SF
– jge  ZF = 1 ou OF = SF

• Interpretação do resultado sem sinal: s1 < s2 se CF = 1


10
Exemplo: tradução de ‘if’
• Suponha o código C:
if (a==b) c=d; // %eax, %ebx, %ecx, %edx
d=a+c;

• Esse código pode ser traduzido da seguinte forma:


cmpl %eax, %ebx
jne depois_if // condição é negativa do if!
movl %edx, %ecx
depois_if:
movl %eax, %edx
addl %ecx, %edx

11