Baixe o app para aproveitar ainda mais
Prévia do material em texto
Apostila sobre a linguagem Assembly Autor: Lincoln César dos Reis Arantes E-mail: lincolnsetelagoas@yahoo.com.br Registradores x86 – IA 32 Registradores são memórias rápidas que ficam no processador com uma finalidade especifica. Registradores para uso geral! Segue abaixo os principais registradores para uso geral: De 16 bits: AX – Acumulador BX – Base CX – Contador DX – Dados SI – Source Index –índice de origem de dados DI – Destination Index – índice de destino BP – Base Pointer – Apontador de base SP – Stack Pointer – Apontador para o topo da pilha IP – Instruction Pointer – Apontador de próxima instrução a ser executada. De 32 bits: EAX - Acumulador Pode ser usado em operações aritméticas. EBX - Base Pode ser usado para apontar para dados. ECX - Contador Pode ser usado em alguns casos em loops para contar os laços de repetição. EDX - Registrador de Dados em geral Vários casos, pode ser usado em multiplicações e divisões e em outros casos como entrada e saída. Perceba que no caso de 32 bits foi adicionado o E na frente do registrador! ESP - Apontador da Pilha -Stack pointer. EBP - Apontador da base - Base pointer. ESI - Índice de origem. EDI - Índice do destino. Registradores de Segmentos CS-Segmento do código (Code segment) DS-Segmento de dados (Data segment) SS-Segmento de Pilha (Stack segment) ES-Segmento com dados extra (Extra segment) FS-Segmento com dados extra (Extra segment) GS-Segmento com dados extra (Extra segment) Registradores de Flags São registros de controles ou melhor sinalizadores para o processador, geralmente funcionam como testadores. Tabela de Flags de 16 bits. Observação: 7 bits não são usados Flag: OF DF IF TF SF ZF AF PF CF Ordem bits: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Overflow Flag (OF) - Exibe o estouro de um bit de alta ordem após uma operação matemática. Direction Flag (DF) - Determina a direção esquerda ou direita para mover ou comparar dados de string. Interrupt Flag (IF) - Determina se as interrupções externas, como entrada de teclado e outros devem ser ignoradas ou processadas. Trap Flag (TF) - Deixa configurar uma operação do processador de uma única vez. Sign Flag (SF) - Exibe o sinal do resultado de uma operação matemática. Zero Flag (ZF) - Indica o resultado de uma operação matemática ou de comparação. Auxiliary Carry Flag (AF) - Contém o carry do bit 3 ao bit 4 após uma operação matemática; usado para aritmética especializada. Parity Flag (PF) - Mostra o número total de 1-bit no resultado obtido de uma operação matemática. Carry Flag (CF) - Contém o carry de 0 ou 1 de um bit de alta ordem (mais à esquerda) após uma operação matemática. Apesar de existirem registradores de 64 bits, não focaremos nele no momento, mas só por efeito de sabedoria os básicos deles são eles: rax, rbx, rcx, rdx. Estrutura de um código Assembly Seção de texto: section .text Na linguagem c, o main informa onde começar o programa, no assembly, na seção text deve ter a declaração global _start para que o kernel entenda onde iniciar o programa. Aqui é colocado o código do programa Seção de dados: section .data Geralmente usado para declarar constantes e dados em geral. (Dados não mudam) Seção de informações de variáveis: section .bss Geralmente usada para declaração de variáveis. Chamadas de sistema Chamadas de sistema (System Calls) são APIS que serve de interface entre programador e o kernel do Sistema Operacional. Quando estamos programando utilizamos bastante de chamadas de sistema. Para facilitar o entendimento colocarei aqui as chamadas mais comuns. Observe o exemplo: Exemplo o abaixo é um sys_write ou chamada de sistema de escrita. mov edx,4 ; Tamanho da mensagem mov ecx, mensagem ; mensagem a ser escrita mov ebx,1 ; file descriptor (stdout) mov eax,4 ; Número da chamada do sistema int 0x80 ; Chamada no kernel Usado quando precisamos mostrar uma mensagem na tela ou em outros casos para mostrar variáveis em geral. Agora, vejamos uma outra chamada também bastante usada, no caso é a sys_read ou chamada de leitura para os menos íntimos, também conhecida no ramo de programação como campo de entrada de dados ou input. Exemplo o abaixo é um sys_read ou chamada de sistema de leitura. mov eax, 3 ; Número da chamada do sistema mov ebx, 2 ; file descriptor (stdout) mov ecx, numero ; valor da variável a ser pegada mov edx, 5 ; Tamanho da mensagem a ser mostrada em bytes int 80h ; Chamada no kernel Usado quando queremos pegar dados que usuário digitou. Agora disponibilizarei aqui uma pequena tabela com os exemplos que falei e outros mais. Fique à vontade e use sua imaginação para criação de novas chamadas. Nome eax ebx ecx edx Sys_exit 1 int sys_fork 2 struct pt_regs sys_read 3 unsigned int Char * Size_t sys_write 4 unsigned int Const char * Size_t sys_open 5 const char * int int sys_close 6 unsigned int Na tabela acima de inicial procure focar sua atenção no eax, pois é ele a opção mais importante que temos que trocar para mudamos as chamadas. Veja que no exemplo mostrado na tabela acima os registradores eax, ebx, ecx, edx são de 32 bits. Como compilar e linkar um código Assembly para geração de um executável? Atenção: certifique-se o Nasm está instalado primeiro, se estiver instalado siga os passos seguintes: 1° Crie um arquivo com o código Assembly utilizando um editor .txt e depois salve-o com a extensão .asm Ex: programa1.asm 2º Abra o terminal do Linux, na linha de comando e digite: nasm -f elf32 programa1.asm Observação: Após utilizar do comando acima, se tudo der certo, será gerado um arquivo programa1.o 3° Crie o executável com o comando abaixo: ld programa1.o -o programa1.x 3° Para executar, digite: ./programa1.x Obrigado!!!!
Compartilhar