Registradores e tipos de dados
Last updated
Last updated
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.
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.
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
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.
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.
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
-
-
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
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
-