Registradores do Processador em Assembly NASM
Para entender a programação em baixo nível, é fundamental conhecer a "área de trabalho" da CPU: os registradores. Eles são pequenas unidades de armazenamento de dados, localizadas fisicamente dentro do processador, que oferecem o acesso mais rápido possível. Enquanto buscar um dado na memória RAM pode levar centenas de ciclos de clock, acessar um registrador geralmente leva apenas um. É essa diferença de velocidade que os torna o local principal onde toda a manipulação de dados acontece.
Os registradores do processador x86-64 são divididos em categorias, mas nosso foco será nos registradores de uso geral (general-purpose registers), que são a base da programação de aplicações em Assembly.
A Base: Registradores da Arquitetura x86 (32 bits)
A arquitetura x86 de 32 bits definiu um conjunto de oito registradores de uso geral. Embora flexíveis, cada um possui uma finalidade convencional, otimizada para certas tarefas:
- EAX (Accumulator): O registrador principal para resultados de operações aritméticas.
- ECX (Counter): Usado como contador em laços (loops) e operações de deslocamento de bits.
- EDX (Data): Um registrador de dados auxiliar, crucial para operações complexas de multiplicação e divisão e para interagir com portas de E/S.
- EBX (Base): Frequentemente usado como um ponteiro para um endereço base de dados na memória.
- ESP (Stack Pointer): Aponta para o topo atual da pilha (stack), uma área de memória vital para gerenciar chamadas de função.
- EBP (Base Pointer): Aponta para a base do quadro de pilha (stack frame) da função atual, servindo como uma referência estável para acessar argumentos e variáveis locais.
- ESI (Source Index): Usado como ponteiro de origem em operações de cópia de dados em massa, como em strings ou arrays.
- EDI (Destination Index): Usado como ponteiro de destino nas mesmas operações de cópia de dados.
Adicionalmente, o EIP (Instruction Pointer) aponta para a próxima instrução a ser executada, e o EFLAGS armazena o estado do processador através de bits de controle e status.
Uma característica poderosa é a capacidade de acessar partes menores desses registradores. Por exemplo, os 16 bits inferiores do EAX são o AX, que por sua vez se divide em AH (byte alto) e AL (byte baixo).

A Evolução: Registradores da Arquitetura x64
A arquitetura x64 expandiu todos os registradores de uso geral para 64 bits, prefixando seus nomes com a letra R (RAX, RBX, etc.). Mais importante, ela adicionou 8 novos registradores de 64 bits: R8 a R15.

Para acessar as partes inferiores dos novos registradores, utiliza-se uma convenção de sufixos:
- D (Doubleword): Para os 32 bits inferiores (ex: R9D).
- W (Word): Para os 16 bits inferiores (ex: R9W).
- B (Byte): Para os 8 bits inferiores (ex: R9B).
Uma Regra Crucial da Arquitetura x64
Ao modificar uma parte de 8 ou 16 bits de um registrador (ex: mov al, 5), os bits superiores do registrador completo (RAX) permanecem inalterados. No entanto, há uma exceção fundamental: qualquer operação de escrita em uma subparte de 32 bits de um registrador (ex: mov eax, 5) zera automaticamente os 32 bits superiores do registrador de 64 bits correspondente.
Por que isso importa? Essa é uma otimização de design da arquitetura x64 para evitar dependências de dados desnecessárias e melhorar o desempenho. Para um programador, isso significa que
mov eax, -1(que preenche EAX com0xFFFFFFFF) resulta em RAX contendo o valor0x00000000FFFFFFFF, e não0xFFFFFFFFFFFFFFFF. Ignorar essa regra é uma fonte comum de bugs.
O Registrador de Flags (RFLAGS)
O registrador RFLAGS é uma coleção de bits de estado, chamados de flags. Ele não armazena dados, mas sim informações sobre o resultado da última operação aritmética ou lógica executada.
| Bit | Nome | Descrição |
|---|---|---|
| 0 | CF | Carry Flag: Indica um "vai um" (transporte) em somas ou um "empresta" em subtrações. |
| 6 | ZF | Zero Flag: Ativado se o resultado de uma operação for exatamente zero. |
| 7 | SF | Sign Flag: Reflete o bit mais significativo do resultado (1 se negativo, 0 se positivo). |
| 11 | OF | Overflow Flag: Indica que o resultado de uma operação com sinal excedeu a capacidade de armazenamento. |
| 10 | DF | Direction Flag: Controla se as operações de string processam dados para frente ou para trás na memória. |
| 9 | IF | Interrupt Flag: Habilita ou desabilita interrupções externas de hardware. |
Os flags mais importantes para a lógica do programa são os de estado: CF, ZF, SF, e OF, pois são eles que as instruções de desvio condicional (je, jg, etc.) utilizam para tomar decisões.
Registradores para Tarefas Especiais
Além dos registradores de uso geral, a CPU possui unidades especializadas com seus próprios registradores:
- Registradores de Ponto Flutuante (x87 FPU): Um conjunto de oito registradores de 80 bits (ST0 a ST7), organizados como uma pilha, para cálculos matemáticos de alta precisão.
Registradores SIMD (SSE/AVX): A tecnologia SIMD (Single Instruction, Multiple Data) permite que uma única instrução opere em múltiplos dados simultaneamente. Para isso, foram introduzidos:
- Registradores XMM (128 bits): Usados para processar quatro números de 32 bits ou dois de 64 bits de uma só vez.
- Registradores YMM (256 bits): Extensões dos XMM que dobram a capacidade de processamento paralelo.
- Registradores ZMM (512 bits): Presentes em processadores mais recentes, expandindo ainda mais essa capacidade.
Esses registradores são a razão pela qual seu computador é tão eficiente em tarefas como edição de vídeo, jogos e computação científica.
Resumo
- Registradores são a memória mais rápida da CPU, funcionando como sua "área de trabalho" imediata.
- Evolução para x64: A arquitetura expandiu os registradores para 64 bits (RAX) e dobrou sua quantidade com a adição de R8 a R15.
- Regra de Ouro da x64: Modificar a parte de 32 bits de um registrador (EAX) zera seus 32 bits superiores (em RAX).
- RFLAGS: O registrador de flags armazena o resultado de operações (zero, negativo, overflow, etc.), permitindo que o programa tome decisões lógicas.
- Registradores Especiais: Existem registradores dedicados para matemática de alta precisão (FPU) e processamento paralelo massivo (SIMD - XMM/YMM).