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 updated