Aprender / Lição 9

Desvios condicionais

Lição 9 de 12Iniciante9 min
Laboratório · 09 / 12

Escolha um caminho

Seu robô-guia

O programa está quase pronto. Faça RBX receber 2 quando RAX for igual a 5.

Blocos

Seu programa

7 instruções
  1. 01 MOV
    mov rax, 5
  2. 02 CMP
    cmp rax, 5
  3. 03 MOV
    mov rbx, 1
  4. 04 JMP
    jmp fim
  5. 05 RÓTULO
    igual:
  6. 06 MOV
    mov rbx, 2
  7. 07 RÓTULO
    fim:

Resultado

PROCESSADORx86-64
RAX64 bits—
RBX64 bits—
RCX64 bits—

Aguardando suas instruções

ZF · indicador de zero—

Simulador didático · blocos equivalem a instruções Intel/NASM. Não executa Assembly nativo.

Entender melhor

JE consulta ZF. Como os valores eram iguais, o programa pulou para “igual” e ignorou o caminho alternativo.

Este laboratório modela MOV, ADD, SUB, CMP, saltos de igualdade e pilha. Os registradores começam sem valor; a aritmética usa 64 bits sem sinal. Só ZF é representada, e cada execução recomeça do início. Repetições param após 200 passos. Não simula memória, outras flags, chamadas ao Linux ou um processador completo.

Consultar a lição completa
Entender melhor · Desvios condicionais
O que você vai aprender

Usar CMP e JE para fazer o programa escolher entre dois caminhos.

Uma decisão dentro do programa

Até agora, cada instrução levava sempre à seguinte. Um desvio condicional permite pular para outro ponto do programa apenas quando uma condição é verdadeira. É assim que um programa toma decisões simples.

No laboratório, um bloco “Marcar destino” dá nome a uma posição, como igual ou fim. O salto consulta o resultado da última comparação e decide se vai até esse nome ou se continua na linha de baixo.

JE, JNE e JMP

JE significa “salte se igual”: ele salta quando a flag ZF está ligada. JNE significa “salte se diferente”: ele salta quando ZF está desligada. JMP salta sempre, sem consultar nenhuma condição.

Um padrão comum é comparar, saltar se a condição valer e, no caminho alternativo, usar JMP para pular o trecho que não deve rodar. Assim, apenas um dos dois caminhos altera o resultado.

Um exemplo, passo a passo

Exemplo comentadox86-64 · Intel / NASM · Linux
; Trecho x86-64 · Intel / NASM · Linux
mov rax, 5
cmp rax, 5
je igual
mov rbx, 1
jmp fim
igual:
    mov rbx, 2
fim:

Entendendo cada passo

  1. CMP encontra valores iguais e liga ZF.
  2. JE vê ZF ligada e pula para igual, sem executar mov rbx, 1.
  3. RBX recebe 2. Se RAX valesse outro número, RBX receberia 1 e JMP pularia o trecho igual.
Para guardar

Um salto condicional depende da comparação feita logo antes dele.

Revisão complementar

Previsão de resultado

Se RAX valesse 4 no exemplo, qual valor ficaria em RBX?

Escolha uma resposta

Marcação opcional, salva apenas neste navegador. Clique novamente para desfazer.