TUTORIAL ASSEMBLY x86/x64 — Versão Acadêmica Profissional
Autor: Adiel Santos Fontes
Linha: Cybernetic Systems Research / Fydelis Ecosystem
Data: Outubro de 2026 | Lote: Dia 2 — Páginas 13–20
📑 Navegação
CAPÍTULO 4 — Movimentação, Aritmética e Lógica de Bits
4.1 Família MOV — Transferência de Dados
A instrução mais usada em todo o código. Não faz cálculos — apenas copia.
| Instrução | Formato | Ação | Observação |
|---|---|---|---|
mov | mov dest, orig | dest ← orig | Tamanho deve coincidir |
movzx | movzx reg, fonte | Expande com zeros | Sem sinal |
movsx | movsx reg, fonte | Expande preservando sinal | Com sinal |
xchg | xchg a, b | Troca a ↔ b | Sem variável temporária |
lea | lea reg, [mem] | reg ← endereço calculado | Não acessa memória! |
Exemplos Práticos
; Movimento básico
mov rax, 42 ; Imediato → registrador
mov rbx, rax ; Registrador → registrador
mov [buffer], al ; Registrador → memória (1 byte)
; LEA = cálculo rápido, sem acesso à memória
lea rax, [rbx + rcx*4 + 10] ; rax = rbx + 4×rcx + 10
💡 Dica:
lea calcula endereço sem ler a memória — é frequentemente usada para aritmética veloz!
4.2 Aritmética Inteira
| Instrução | Ação | Afeta Flags |
|---|---|---|
add d, v | d = d + v | CF ZF SF OF |
sub d, v | d = d − v | CF ZF SF OF |
inc r | r = r + 1 | ZF SF OF (preserva CF!) |
dec r | r = r − 1 | ZF SF OF (preserva CF!) |
neg r | r = −r | Todas |
4.3 Multiplicação e Divisão
⚠️ Atenção: Antes de
div/idiv, rdx deve estar definido — zere com xor rdx, rdx para valores sem sinal!
; === MUL — Sem sinal ===
mov rax, 17
xor rdx, rdx ; ✅ obrigatório
mov rcx, 5
div rcx ; rax = 3 (quociente), rdx = 2 (resto)
; === IDIV — Com sinal ===
mov rax, -17
cdq ; converte rax → rdx:rax automaticamente
mov rcx, 5
idiv rcx ; rax = -3, rdx = -2
4.4 Lógica e Manipulação de Bits
| Instrução | Efeito | Uso |
|---|---|---|
and | E bits a bits | Isolar/zerar bits |
or | OU bits a bits | Ativar bits |
xor | XOR bits a bits | Inverter / zerar registrador |
shl d, n | Desloca esquerda n vezes | × 2ⁿ |
shr d, n | Desloca direita (preenche 0) | ÷ 2ⁿ (sem sinal) |
sar d, n | Desloca direita preserva sinal | ÷ 2ⁿ (com sinal) |
; Zerar registrador — forma mais eficiente
xor rax, rax
; × 8 via deslocamento
mov rax, 5
shl rax, 3 ; rax = 5 × 8 = 40
CAPÍTULO 5 — Controle de Fluxo: Comparações, Saltos e Laços
5.1 Flags — O Sistema de Decisão
Toda decisão condicional depende de flags atualizadas após instruções de cálculo/comparação.
| Flag | Nome | Ativa quando |
|---|---|---|
| ZF | Zero | Resultado = 0 |
| SF | Sinal | Resultado negativo |
| CF | Carry | Transbordo (sem sinal) |
| OF | Overflow | Transbordo (com sinal) |
5.2 Comparação e Tabela de Saltos
cmp a, b ; Faz a − b, atualiza flags e descarta resultado
| Instrução | Significado | Condição | Tipo |
|---|---|---|---|
je | Igual | ZF = 1 | Geral |
jne | Diferente | ZF = 0 | Geral |
jg | Maior que | ZF=0 E SF=OF | Com sinal |
jl | Menor que | SF ≠ OF | Com sinal |
ja | Acima | CF = 0 | Sem sinal |
jb | Abaixo | CF = 1 | Sem sinal |
⚠️ Regra de ouro: Para contadores, endereços e tamanhos — valores sem sinal — use sempre
ja/jb. Usar jg/jl causa erros silenciosos difíceis de rastrear!
5.3 Estrutura: SE-ENTÃO-SENÃO
; if (rcx > 10) { rdx = 1; } else { rdx = 2; }
cmp rcx, 10
jle .menor_igual ; Salta se condição contrária
mov rdx, 1
jmp .fim
.menor_igual:
mov rdx, 2
.fim:
5.4 Laços de Repetição
Laço Contado
; soma = 1+2+...+10 = 55
mov rcx, 1
xor rax, rax
.laco:
add rax, rcx
inc rcx
cmp rcx, 11
jne .laco
Laço com LOOP (forma compacta)
mov rcx, 10 ; contador fixo em RCX
.laco:
add rax, rcx
loop .laco ; RCX--; se ≠0 → salta
5.5 Exercício Resolvido — Fatorial
; Entrada: RCX = n | Saída: RAX = n!
fatorial:
mov rax, 1
.ciclo:
cmp rcx, 1
jle .fim
mul rcx
dec rcx
jmp .ciclo
.fim:
ret
RESUMO — PÁGINAS 13–20
| Conceito | Domínio Alcançado |
|---|---|
| Movimentação | mov, lea, xchg, movzx, movsx |
| Aritmética | add, sub, inc, dec, mul, imul, div, idiv |
| Lógica de Bits | and, or, xor, shl, shr, sar, rol |
| Decisão | cmp + tabela completa de saltos condicionais |
| Estruturas | Se-então-senão, laços contados, while, break |
| Prática | Fatorial, conversão numérica, contagem de pares |
⚠️ Armadilhas Comuns e Correções
| Erro | Causa | Correção |
|---|---|---|
div dá valor lixo | rdx não foi zerado | Sempre xor rdx,rdx antes de dividir sem sinal |
| Laço roda infinito | Condição de parada inatingível | Verifique incremento e operador de comparação |
| Falha com valores grandes | Usou jg em vez de ja | Contadores = sem sinal → ja/jb |
| Erro de montagem direto | mov [mem1],[mem2] não existe | Use registrador intermediário |
📅 Próxima Etapa — Dia 3
- Capítulo 6 — Manipulação de strings e blocos de memória (
movsb, lodsb, stosb, rep) - Capítulo 7 — Pilha, quadros de função e convenção System V
- Exercícios práticos: comprimento de string, inversão, comparação
FydelisTech
Cybernetic Systems Research · Fydelis Ecosystem
© 2026 Adiel Santos Fontes — Conteúdo educacional aberto
Comentários
Enviar um comentário