Assembly Language & x86 Low-Level Systems Programming · Aula

Predição de desvios e execução especulativa

Veja como as CPUs modernas preveem desvios e executam instruções especulativamente para ocultar a latência, como previsões incorretas custam ciclos e como efeitos colaterais deram origem a ataques da classe Spectre.

Aula 4 de 413 etapas

Predição de desvios e execução especulativa é uma aula grátis de Assembly Language & x86 Low-Level Systems Programming no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Assembly Language & x86 Low-Level Systems Programming, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Assembly Language & x86 Low-Level Systems Programming inclui 4 aulas no total.

Partes desta aula ainda não foram traduzidas e aparecem em inglês.

The Pipeline Problem

Modern CPUs are deeply pipelined, fetching and decoding many instructions ahead. But a conditional branch is a fork: the CPU does not yet know which path to fetch. Stalling would waste the whole pipeline.

Branch Prediction

To avoid stalls the CPU predicts which way a branch will go and keeps fetching. If correct, no time is lost. If wrong, the pipeline is flushed — a costly misprediction penalty of 15-20+ cycles.

How Predictors Learn

The Branch Target Buffer and history tables record past outcomes. A simple 2-bit saturating counter remembers whether a branch was recently taken, predicting that loops keep looping.

Speculative Execution

Beyond predicting, the CPU speculatively executes the predicted path before the condition resolves. If the guess holds, results are committed; if not, they are discarded as if they never ran — architecturally.

Writing Predictable Branches

You help the predictor by making branches consistent. A branch that is almost always taken predicts well; a random branch defeats prediction. Sorting data before a conditional loop can dramatically speed it up.

for (int i = 0; i < n; i++)
    if (data[i] >= 128)   // predictable only if data is sorted
        sum += data[i];

A Runnable Benchmark

This C program shows the dramatic effect of sorted vs unsorted data on a branch-heavy loop. Run it and compare timings.

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int n = 32768;
    int *d = malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) d[i] = rand() % 256;
    long sum = 0;
    for (int r = 0; r < 1000; r++)
        for (int i = 0; i < n; i++)
            if (d[i] >= 128) sum += d[i];
    printf("sum=%ld\n", sum);
    free(d);
    return 0;
}

Branchless Programming

You can sometimes eliminate a branch entirely with arithmetic or conditional-move instructions (cmov), so the CPU never needs to predict.

cmp eax, 128
cmovge ebx, ecx   ; conditionally move, no branch to mispredict

Likely/Unlikely Hints

Compilers expose hints like __builtin_expect (the source of likely()/unlikely() macros) so hot paths fall through and cold paths jump away, improving instruction-cache layout.

if (__builtin_expect(error, 0)) {
    handle_error();   // marked cold/unlikely
}

The Security Side Effect

Speculative results are discarded architecturally — but they leave traces in the cache. Speculatively loaded data warms cache lines, and that timing difference can be measured. This is the basis of side-channel leaks.

Spectre in a Nutshell

Spectre tricks the predictor into speculatively reading memory it should not, then leaks the value through a cache timing side channel. The reads never commit, so they bypass normal bounds checks during the speculation window.

Mitigations

Defenses include serializing instructions (lfence) to stop speculation past a bounds check, retpolines for indirect branches, and microcode updates. They trade some performance for safety.

cmp index, limit
jae out_of_range
lfence            ; block speculation past the check

Quick Check

Test your understanding of speculation.

Recap

You learned how CPUs hide branch latency:

  • Branch prediction guesses the path; mispredicts cost a pipeline flush
  • Speculative execution runs the predicted path early
  • Predictable branches, cmov, and likely/unlikely hints boost speed
  • Speculation leaves cache side effects exploited by Spectre; lfence and retpolines mitigate it
Grátis para começar

Aprenda Assembly com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
12
Aulas
48

Perguntas Frequentes

A aula “Predição de desvios e execução especulativa” é grátis?

Sim — o texto completo de “Predição de desvios e execução especulativa” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Assembly Language & x86 Low-Level Systems Programming, atualize para CoddyKit PRO. O curso de Assembly Language & x86 Low-Level Systems Programming inclui 4 aulas no total.

O que vou aprender em “Predição de desvios e execução especulativa”?

Veja como as CPUs modernas preveem desvios e executam instruções especulativamente para ocultar a latência, como previsões incorretas custam ciclos e como efeitos colaterais deram origem a ataques da… Você pratica Assembly Language & x86 Low-Level Systems Programming com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Assembly Language & x86 Low-Level Systems Programming?

Nenhuma experiência prévia é necessária. Assembly Language & x86 Low-Level Systems Programming no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Predição de desvios e execução especulativa”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Assembly Language & x86 Low-Level Systems Programming?

Sim. Cada aula de Assembly Language & x86 Low-Level Systems Programming inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Coerência de Cache e Desempenho
  2. Otimização Manual de Seções Críticas
  3. Transbordamentos de Buffer e Shellcode
  4. Predição de desvios e execução especulativa
← Voltar para Assembly Language & x86 Low-Level Systems Programming