Essa série de artigos aborda conceitos básicos de baixo nível em computadores, com foco específico na exploração de binários e engenharia reversa. Alguns pontos podem parecer confusos à primeira vista, mas lembre-se: tudo segue uma definição. Não se prenda a uma sequência infinita de “porquês!?” — apenas compreenda cada conceito e seu propósito. Você vai usar esses conceitos em engenharia reversa, exploração de binários e até no desenvolvimento de malware no futuro.
O que é uma CPU? Link para o cabeçalho
A Unidade Central de Processamento (CPU, do inglês Central Processing Unit) é o “cérebro” de um computador, responsável por processar informações e gerenciar os dados armazenados na memória. Ela executa funções essenciais como processamento, armazenamento e operações de entrada/saída, sendo crucial para o funcionamento de sistemas de computador, incluindo sistemas operacionais, dispositivos móveis e sistemas embarcados.
Um computador, de maneira simplificada, pode ser visto como um conjunto de instruções armazenadas na memória, que são processadas pela CPU. A arquitetura básica de um computador é composta por três componentes principais: a CPU, a memória e os dispositivos de entrada e saída, todos conectados através de um barramento(BUS) (veja a imagem acima).
A fundação dessa arquitetura foi proposta por John Von Neumann, cujos conceitos ainda influenciam os projetos de processadores modernos. No entanto, as CPUs contemporâneas frequentemente não seguem de forma rígida a arquitetura original de Von Neumann, embora muitos de seus princípios permaneçam fundamentais. Além disso, as CPUs podem adotar diferentes modelos de gerenciamento interno, como CISC (Complex Instruction Set Computing) e RISC (Reduced Instruction Set Computing), que serão explicados mais adiante.
Componentes de um Computador Link para o cabeçalho
CPU internal components Link para o cabeçalho
Registradores Link para o cabeçalho
Os registradores são áreas de armazenamento interno da CPU, projetadas para processar dados de maneira rápida. Ao contrário da memória RAM, onde os dados permanecem por um período mais longo, os dados nos registradores são temporários e usados em operações de alta velocidade. Antes de serem processados, todos os dados precisam ser armazenados em um registrador. (Este conceito será melhor compreendido quando abordarmos a linguagem de Assembly).
Unidade Aritmética e Lógica (ALU) Link para o cabeçalho
A ALU (Unidade Aritmética e Lógica) é responsável por realizar os cálculos aritméticos (como adição e subtração) e operações lógicas (como AND, OR, NOT) que foram decodificados pela Unidade de Controle (CU).
Entre os processos mais comuns executados pela ALU, estão:
- Adição
- Subtração
- Divisão
- Multiplicação
- Seleção / Ramificação
- Repetição / Looping
Unidade de Controle (Control Unit) Link para o cabeçalho
A Unidade de Controle (UC) é a parte da CPU responsável por coordenar e gerenciar as operações do sistema. Ela controla as operações de entrada e saída (E/S), as operações da ALU (Unidade Aritmética e Lógica), o acesso à memória e a interação com os dispositivos periféricos. A UC interpreta as instruções do programa e assegura que cada componente da CPU execute suas tarefas de forma ordenada e eficiente, garantindo o correto funcionamento do sistema.
Cache Link para o cabeçalho
O cache é uma memória de acesso rápido, localizada próxima à CPU, que auxilia na aceleração das operações.
Tipos de Cache: Link para o cabeçalho
- Cache L1:
- Integrado ao processador ou próximo a ele.
- Menor capacidade, mas mais rápido.
- Armazena dados de acesso frequente (ex.: registradores).
- Tamanho: 2 KB a 64 KB.
- Cache L2:
- Pode ser integrado ao processador ou localizado próximo a ele.
- Maior capacidade que o L1.
- Serve de intermediário entre L1 e o restante da memória.
- Tamanho: 256 KB a 512 KB.
- Cache L3:
- Fica fora do processador.
- Aumenta o desempenho do L1 e L2.
- Maior capacidade que L1 e L2.
- Tamanho: 1 MB a 8 MB.
Em resumo, cada nível de cache armazena dados de forma hierárquica, otimizando o desempenho da CPU.
Unidade de Gerenciamento de Memória (Memory Management Unit - MMU) Link para o cabeçalho
A Unidade de Gerenciamento de Memória (MMU) é responsável por ajudar o sistema operacional a gerenciar os recursos de memória de forma eficiente. Ela controla a alocação e a liberação de memória, além de traduzir endereços virtuais para endereços físicos, permitindo que o sistema operacional acesse e manipule dados de forma segura e otimizada. A MMU também é essencial para o gerenciamento de memória virtual, garantindo que os processos sejam isolados e que a memória seja utilizada de maneira eficaz.
Firmware Link para o cabeçalho
O firmware é um tipo de programa fixo e especializado, incorporado diretamente ao hardware de um dispositivo, responsável pela inicialização e configuração básica do sistema. Ele fornece as instruções necessárias para que o hardware funcione corretamente e inicia o processo de carregamento do sistema operacional. O firmware é essencial para o funcionamento inicial de dispositivos, como computadores, impressoras e roteadores.
CPU External Link para o cabeçalho
Memória Principal (RAM) Link para o cabeçalho
A memória RAM (Random Access Memory) é uma memória volátil que armazena dados temporários enquanto o sistema está em funcionamento. Ela organiza esses dados em sequência de bytes, com cada byte possuindo um endereço único que é utilizado para acessá-lo rapidamente. A quantidade de memória RAM disponível determina a memória física de um dispositivo ou computador. Atualmente, as memórias RAM podem ter capacidades que variam de gigabytes (GB), sendo usadas para armazenar dados temporários, como o sistema operacional e áreas específicas para buffers e dispositivos de entrada/saída (E/S).
A imagem abaixo exemplifica o funcionamento de uma memória RAM de 16 GB em um sistema moderno:

- Livre (Free): Refere-se aos espaços de memória disponíveis para o sistema operacional e para o gerenciamento de processos em execução.
Os demais espaços de memória são utilizados para o gerenciamento de hardware, operações de entrada/saída (E/S) e para o sistema operacional.
Atualmente, a memória física não é acessada diretamente pelos processos. Em vez disso, ela é mapeada por meio de espaços de endereçamento e memória virtual, permitindo que o sistema operacional gerencie e aloque a memória de forma eficiente, isolando os processos e maximizando o uso dos recursos disponíveis.
Armazenamento Externo (External Storage) - (ex.: Discos Rígidos, Drives USB, etc.) Link para o cabeçalho
Os dispositivos de armazenamento externo são memórias não voláteis, ou seja, retêm os dados mesmo quando o sistema é desligado. Eles oferecem capacidades de armazenamento muito maiores em comparação à memória RAM, mas, em contrapartida, tendem a ser mais lentos em relação à velocidade de acesso. Esses dispositivos são utilizados para armazenar grandes volumes de dados de forma permanente, como arquivos, programas e sistemas operacionais.
Portas Link para o cabeçalho
As portas são os pontos de acesso físicos ou lógicos que permitem a conexão de periféricos ao computador. Dispositivos como impressoras, teclados, mouses e outros acessórios são conectados através dessas portas. Os drivers são programas específicos que gerenciam a comunicação entre o sistema operacional e os periféricos, controlando como esses dispositivos são manipulados e interagindo com o computador.
Barramento (Bus) Link para o cabeçalho
O barramento é um conjunto de caminhos físicos ou lógicos em um sistema que permite a transferência de dados entre os diferentes componentes do computador. Ele facilita a comunicação entre a CPU, memória e periféricos.

Os três principais tipos de linhas em um barramento são:
- Linha de controle: Responsável por gerenciar as operações de controle e sincronização entre os componentes.
- Linha de endereçamento: Transporta os endereços de memória ou de dispositivos para especificar onde os dados devem ser lidos ou gravados.
- Linha de dados: Transfere os dados propriamente ditos entre os componentes.
Como um programa é executado? Link para o cabeçalho
Quando abrimos um programa, ele é carregado na memória do computador. Um programa nada mais é do que um conjunto de instruções em código de máquina que a CPU deve executar.
Em uma CPU de 32 bits (como a arquitetura x86), ela lê pequenos blocos de dados chamados doublewords (que têm 4 bytes ou 32 bits). Ao encontrar um endereço na memória, a CPU pega esse bloco de dados e o armazena temporariamente em um de seus registradores, que são como gavetas rápidas. Depois, a CPU lê o conteúdo desses dados e executa a instrução contida ali.
Após a execução de cada instrução, a CPU busca a próxima instrução na memória.
A CPU possui um registrador chamado Instruction Pointer (IP), ou EIP (Extended Instruction Pointer) / RIP (Register Instruction Pointer), que aponta para o endereço da próxima instrução a ser executada.
Esse registrador pode ser manipulado, alterando o fluxo do programa. Isso é explorado por malwares para modificar o comportamento do sistema.
Risc vs. Cisc Link para o cabeçalho

Cisc Link para o cabeçalho
CISC (Complex Instruction Set Computer, em português, “Computador com Conjunto Complexo de Instruções”) é uma arquitetura de processador que prioriza instruções poderosas, com múltiplas etapas ou funcionalidades. Foi projetada para minimizar a quantidade de instruções que o programador precisa escrever, oferecendo comandos com diversas funcionalidades. Essa arquitetura é muito comum em computadores pessoais e servidores, sendo utilizada por empresas como Intel e AMD.
Principais características do CISC: Link para o cabeçalho
- Instruções complexas e de várias etapas: Muitas instruções CISC executam várias operações de uma só vez, isso reduz a quantidade de instruções nescessarias, porém diminui a velocidade da operação.
- Instruções de comprimento variável: As instruções podem ser de diferentes tamanhos
- Acesso direto á memória: As instruções CISC podem acessar a memória diretamente, isso simplifica a programação, porém aumenta o tempo de acesso aos dados.
- Modos de endereçamento avançados: O CISC possui muitas formas de endereçamento, isso resulta em flexibilidade para gerenciar estrutura de dados…
Exemplo de uma instrução CISC Link para o cabeçalho
No assembly x86, uma única instrução pode combinar:
- Carregamento de dados
- Aritmética (cálculos) Veja:
mov eax, [ebx]
Essa única linha move (carrega) o valor do endereço de memória contido em ebx
para o registrador eax
.
Componentes: Link para o cabeçalho
- mov: Este é o registrador move (mover), usado para copiar dados de um lugar para outro. No assembly x86, o
mov
é usado para carregar dados da memória, ou de outro registrador, para um registrador específico. - eax: Este é o registrador de destino, ou seja, o lugar onde os dados serão copiados.
- [ebx]: Isso indica o operando de origem. Os colchetes ao redor do
ebx
indicam que o valor que será acessado não está diretamente no registradorebx
, mas sim no endereço de memória que está armazenado no registradorebx
. Ou seja,ebx
contém um endereço de memória, e o valor que está nesse endereço será movido para o registradoreax
.
Vantagens do CISC Link para o cabeçalho
- Compatibilidade com versões anteriores: A arquitetura CISC como x86 mantiveram a compatibilidade com outras gerações mais antigas. Isso permitiu que softwares mais antigos sejam executados nos sistemas atuais.
- Desempenho versátil: Com a flexibilidade que o CISC tem, isso o torna ideal para computação de uso geral.
O CISC tem suas vantagens para computadores, onde os recursos são maiores. No entanto, isso consome mais energia e gera calor, o que é inadequado para dispositivos móveis, onde a eficiência é fundamental. Nos dias atuais, o CISC utiliza estruturas internas semelhantes às do RISC para melhorar a eficiência.
RISC Link para o cabeçalho
RISC (Reduced Instruction Set Computer, em português literal, “Computador com um conjunto reduzido de instruções”) É uma arquitetura/Design de processadores focados na simplicidade e velocidade. Em arquiteturas RISC como: ARM e RISC-V, as instruções são feitas para serem executadas em um único ciclo de clock, isso aumenta a velocidade da execução e diminui o consumo de energia. Tornando o RISC ideal para dispositivos moveis, sistemas embarcados e computação eficiente.
Principais características do RISC: Link para o cabeçalho
- Instruções simples de ciclo único: As instruções RISC são simples, permitindo execução rápida.
- Instruções de comprimento fixo: As instruções tem um comprimento fixo, sendo assim, a complexidade de decodificação diminui, resultando no aumento da velocidade da execução.
- Arquitetura de carregamento/armazenamento: O RISC separa o acesso á memoria e a computação. exigindo que os dados sejam carregados primeiro nos registradores e depois, operado. Isso significa que antes de realizar qualquer tipo de operação aritmética ou lógica em um dado, o dado precisa ser carregado (load) primeiro para um registrador. Depois de manipulá-lo, o resultado pode ser armazenado (store) de volta na memória.
- Modo de endereçamento limitados: o RISC tem menos instruções de endereçamento, isso reduz a complexidade. Mas por outro lado, isso exige instruções adicionais para operações mais complexas.
Exemplo de uma sequência de instruções RISC Link para o cabeçalho
No assembly ARM, muitas instruções separam o carregamento e o processamento dos dados.
Carregar Dados da Memória para os Registradores Link para o cabeçalho
ldr r0, [r1] ; Carrega o valor do endereço de memória armazenado em r1 para o registrador r0
add r0, r0, #1 ; Adiciona 1 ao valor de r0
str r0, [r1] ; Armazena o resultado da operação no endereço de memória indicado por r1
Aqui, carregamos o valor da memória para um registrador, realizamos a operação, e em seguida, armazenamos o resultado de volta na memória. É simples e eficiente.
Vantagens do RISC Link para o cabeçalho
-
Eficiência de energia: Devido às suas instruções simples, a arquitetura RISC consome menos energia, tornando-a ideal para dispositivos móveis e IoT (Internet das Coisas).
-
Escalabilidade e flexibilidade: Arquiteturas RISC, como a ARM, podem ser usadas em uma grande variedade de dispositivos, desde simples aparelhos móveis até grandes data centers.
Arquitetura x86 Link para o cabeçalho
A arquitetura x86 teve origem com o microprocessador 8086, desenvolvido pela Intel. Devido ao seu sucesso, a empresa expandiu a linha, lançando novos modelos como 80186, 80286, 80386 e assim por diante.

Inicialmente, a nomenclatura seguia o padrão 80x86, onde o “x” representava um número variável. Com o tempo, para simplificação, o nome foi abreviado para x86, tornando-se o termo amplamente utilizado até hoje. Com a evolução da tecnologia, a arquitetura x86 recebeu diversas melhorias e extensões, sempre preservando a compatibilidade com gerações anteriores. Esse princípio permitiu que softwares antigos continuassem funcionando em processadores mais modernos, garantindo uma transição suave entre diferentes gerações de hardware. Uma das mudanças mais significativas veio com a AMD, que desenvolveu a arquitetura x86-64, introduzindo suporte a 64 bits. Essa inovação permitiu maior capacidade de processamento e suporte a mais memória RAM, marcando um avanço significativo na computação de alto desempenho. Embora a Intel tenha inicialmente apostado em sua própria arquitetura de 64 bits, chamada IA-64 (usada na linha Itanium), ela acabou adotando o padrão x86-64 da AMD. Isso garantiu que processadores de ambas as empresas fossem compatíveis e seguissem um mesmo conjunto de instruções, promovendo uma evolução conjunta da arquitetura. Hoje, Intel e AMD continuam avançando na arquitetura x86-64, incorporando novas tecnologias, melhorando eficiência energética e desempenho, mas sempre mantendo a compatibilidade.
Nome Oficial | Nome Alternativo | Bit | Conjunto de Instruções | Design |
---|---|---|---|---|
8086 | IA-16 | 16 | x86 | CISC |
Nome Oficial | Nome Alternativo | Bit | Conjunto de Instruções | Design |
---|---|---|---|---|
IA-32 | i386 | 32 | x86 | CISC |
Nome Oficial | Nome Alternativo | Bit | Conjunto de Instruções | Design |
---|---|---|---|---|
x86-64 | i686 | 64 | x86-64 (AMD64) | CISC |
Perguntas frequentes Link para o cabeçalho
O que é x86? Link para o cabeçalho
x86 é um conjunto de instruções (ISA - Instruction Set Architecture) desenvolvido pela Intel e usado em várias arquiteturas de processadores. A arquitetura x86 foi introduzida com os processadores da família 8086 e evoluiu ao longo dos anos, sendo amplamente utilizada em processadores modernos.
O que significa “32 bits” em relação à arquitetura de um processador? Link para o cabeçalho
“32 bits” refere-se à largura do processador, indicando que ele pode processar dados e endereços de memória em unidades de 32 bits. Isso significa que o processador pode lidar com valores de 32 bits (ou 4 bytes) em cada operação.
x86 sempre se refere a 32 bits? Link para o cabeçalho
Não necessariamente. Embora x86 seja frequentemente associado à arquitetura de 32 bits, o termo “x86” originalmente se refere ao conjunto de instruções, que abrange tanto 32 bits quanto 64 bits. Porém, por costume, quando alguém menciona x86, pode estar se referindo à versão de 32 bits.
O que é a diferença entre x86 e x86-64? Link para o cabeçalho
x86-64 (ou AMD64) é a versão de 64 bits da arquitetura x86. A principal diferença é que, enquanto x86 é de 32 bits, x86-64 permite a manipulação de endereços e dados em 64 bits, oferecendo maior capacidade de memória e desempenho. O termo x86 é usado para se referir tanto a 32 bits quanto a 64 bits, mas x86-64 especifica que o processador está usando a versão de 64 bits.
Quando é adequado usar o termo x86? Link para o cabeçalho
O termo x86 pode ser usado para se referir à arquitetura de 32 bits tradicional. No entanto, também pode ser utilizado de maneira geral para se referir à arquitetura como um todo, incluindo a versão de 64 bits. Por isso, quando falamos de x86, normalmente estamos nos referindo à arquitetura de 32 bits, mas ela também pode abranger a versão de 64 bits dependendo do contexto.
Como sabemos se estamos lidando com x86 de 64 bits ou 32 bits? Link para o cabeçalho
Se estivermos falando sobre x86 e não for especificado, é mais seguro assumir que estamos nos referindo à versão de 32 bits. Para indicar explicitamente que se trata de 64 bits, usamos os termos x86-64 ou AMD64. Essas denominações especificam que o processador é capaz de lidar com dados e endereços de memória em 64 bits.
Qual a principal vantagem do x86-64 (ou AMD64) sobre o x86? Link para o cabeçalho
A principal vantagem de x86-64 (ou AMD64) sobre o x86 é a capacidade de manipular endereços e dados em 64 bits, o que permite acessar uma quantidade muito maior de memória RAM (acima dos 4GB que o x86 de 32 bits suporta). Além disso, processadores x86-64 geralmente têm desempenho melhor, devido à capacidade de processar mais dados de uma vez.