Registradores e tipos de dados

Registradores e Tipos de Dados

Aqui estaremos estudando os registradores da arquitetura x86 e x86-64, seguindo principalmente o padrão da Intel.
Para guardar variáveis de forma no geral e passá-los de uma parte da memória para outra, a nossa principal ferramenta são os registradores.

Registradores

Na arquitetura x86 temos 8 registradores de propósitos gerais (ou GPR) de 32-bits, alguns deles também podem ser divididos em registradores de 8 e 16 bits.

Registradores de propósito geral

Como o próprio nome diz, esses registradores são de propósito geral, ou seja, podem ser usados para "qualquer coisa", mas usualmente seguem algumas convenções
Registrador
Convenção
16 - Bits
8 Bits
EAX
Acumulador, usado para operações aritméticas e para guardar resultados
AX
AH-AL
EBX
Registrador secundário, usado como "base" em operações de vetores
-
-
ECX
Contador em loops
-
-
EDX
Usado para guardar endereços de dados
-
-

Registradores de Endereços

Registrador
Propósito
16 - Bits
ESI
Fonte em operações de memória/strings
SI
EDI
Destino em operações de memória/strings
DI
EBP
Registrador base para a stack/pilha (frame atual)
BP
ESP
Pointeiro da stack/pilha
SP

Outros registradores

Registrador
Propósito
16 - Bits
EIP
Instruction Pointer (Program counter) - Indica em qual instrução a execução se encontra
-
EFLAGS
Guarda resultado de operações - Ex: Flag Zero
-

Set de Instruções

O conjunto de instruções x86 envolve o movimento de dados entre registradores e memória, classificados em 5 tipos:
    Imediato para registrador
    Registrador para registrador
    Imediato para memória
    Registrador para memória e vice-versa
    Memória para memória - Somente nas arquiteturas RISC.

x86

O foco aqui será a sintaxe da Intel.
Intel vs AT&T
A AT&T prefixa os registradores com % e imediatos com $, o que não acontece na Intel. Eles também adicionam um prefixo à instrução para indicar o tamanho do dado da operação (long, byte, etc. ). Na sintaxe da Intel, o destino vem e, em seguida, a fonte (op dest source ), na AT&T é o contrário. (Pense em dest=fonte) As instruções têm comprimento variável (1 a 15 bytes ).
x86 usa colchetes ( [] ) para indicar acesso à memória (semelhante ao asterisco ( * ) em C / C ++ ) Para somar ou subtrair o endereço dentro de [] geralmente é usado hexadecimal, por exemplo: mov eax [ecx + 10h] - Onde h é usado para indicar notação hexadecimal.
Instruções
    MOV - mov ecx, [eax]
      Seta ecx = [eax]
    ADD - inc dword ptr [eax]
      Incrementa o valor no endereço eax.
    SUB - sub eax, 0x20
      Subtrai eax por 0x20 (32 em decimal).
    PUSH - push eax
      Coloca eax na stack.
    POP - pop eax
      Tira o endereço do topo da stack e salva em eax.
    CMP - cmp eax, ebx
      if (eax == ebx) seta eflags;
    JNE - jne 0x400086
      Pula para o endereço dado se eflags foi setado como igual.
    CALL - call 0x400086
      Pula para o endereço dado e salva a localização atual na stack. Equivalente às instruções:
        push rip
        jump 0x400086
    RET - ret
      Tira o endereço da stack e retorna o controle para aquela localização.
        pop rip
    LEA - lea eax, [esp+0x1c]
      Move o endereço do registrador para outro. Usado para passar parâmetros para funções.
    LEAVE - leave
      Move ebp para esp e tira ebp da stack.
Last modified 1yr ago