Programando em Assembly

Documentos relacionados
Linguagem de Montagem Assembly

Introdução ao Assembly

Fluxo de Execução em Assembly

A arquitectura IA32. A arquitectura de um processador é caracterizada pelo conjunto de atributos que são visíveis ao programador.

Assembly do IA-32 em ambiente Linux

CPU. CPU Unidade Central de Processamento. Função: leitura, escrita e processamento de dados

Assembly do IA-32 em ambiente Linux

Intel x AT&T - recapitulação

Computadores de Programação (DCC/UFRJ)

Ordem de Bytes: Big Endian e Little Endian

Lic. Ciências da Computação

Estrutura de uma função ( / procedimento )

Programação ao nível da máquina

A linguagem ASSEMBLY

Estruturas de controlo do C if-else statement

Linguagem de Montagem e Assembly. André Luiz da Costa Carvalho

Professor: Dr. Rogério Rodrigues de Vargas.

Programação em Assembly Optimização do código

Computadores e Programação (MAB ) Lista 2 - Grupo de até 3 alunos - 90 pontos

Arquitetura e Organização de Computadores

Sistemas de Computação

Estrutura do tema ISA do IA-32

TEÓRICA. lb $t0, 1($t1)

Estrutura do tema ISA do IA-32

Sistemas de Computação para Controle e Automação CIC132. Assembly. Assembly. Notas. Décima quarta aula: Introdução a programação Assembly

Pilha de execução Volnys Borges Bernal Departamento de Sistemas Eletrônicos (PSI) Escola Politécnica da USP

Arquitectura de Computadores Y86 Instruções

Estrutura do tema ISA do IA-32

Arquitetura de Computadores Trabalhos Práticos

Assembly IA32 Procedimentos

Lic. Eng.ª Informática

Computadores e Programação (MAB-353) Primeira Prova -Prof. Paulo Aguiar (DCC/UFRJ) 19/05/ pontos

Nível da Arquitetura do Conjunto de Instruções. Ronaldo de Freitas Zampolo

Computadores e Programação (DCC/UFRJ)

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Curso: LMCC Exame 1ª Chamada 14/Jun/06 Disciplina: Arquitectura de Computadores Duração: 2h30m

AJProença, Sistemas de Computação, UMinho, 2017/18 1. Componentes (físicos) a analisar: a unidade de processamento / o processador:

Getting Started. Pedro Garcia de Janeiro de Assembly Working Party

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

Arquitectura e Organização de Computadores

PARTE II - CONJUNTO DE INSTRUÇÕES ARQUITETURA DE COMPUTADORES ANTONIO RAMOS DE CARVALHO JÚNIOR

Testando o Teorema de De Morgan

Arquitetura e Organização de Computadores

Organização de Computadores

Aula 4 Conjunto de Instruções do Microprocessador 8085 Grupo Aritmético

Assembly x86. Hugo Bessa - hrba Paulo Serra Filho ptvsf

Representação de Dados (inteiros não negativos)

Introdução à Arquitetura e Linguagem Assembly de Processadores IA-32

Estrutura do tema ISA do IA-32

Arquitectura e Organização de Computadores

Unidade Central de Processamento 2. Registradores

Microprocessadores I ELE Conjunto de Instruções do Microprocessador 8085 Aula 9 - PILHA E SUBROTINAS -

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Representação de Dados

Universidade Federal da Bahia Instituto de Matemática Departamento de Ciência da Computação MATA49 Programação de software básico Arquitetura Intel

INTRODUÇÃO À LINGUAGEM C

Nível da Arquitetura do Conjunto das Instruções

Linguagem C Princípios Básicos (parte 1)

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

Introdução a Engenharia Reversa

Programação ao nível da máquina. Operações lógicas e aritméticas

No. de bits. O primeiro IBM PC foi construído com o 8088 (versão de 8 bits do 8086).

Introdução aos Sistemas Computacionais 2008/09

16. Compilação no Linux

Disciplina de Organização de Computadores I

SSC510 Arquitetura de Computadores 1ª AULA

Disciplina: Arquitetura de Computadores

Procedimentos Chamada de Funções e Parâmetros

Sistemas Operacionais. Pilha de execução Volnys B. Bernal 1. Agenda. Pilha de execução. Os problemas. Os problemas.

Procedimentos Chamada de Funções e Parâmetros

Lic. Engenharia de Sistemas e Informática

INTRODUÇÃO À LINGUAGEM C

Arquitetura de Computadores I. Prof. Ricardo Santos (Cap 2)

Trabalhos Práticos Arquitetura de Computadores I Prof. Fabian Vargas

ALOCAÇÃO DINÂMICA DE MEMÓRIA

Microprocessadores I ELE Aula 7 Conjunto de Instruções do Microprocessador 8085 Desvios

Algoritmos II prof. Daniel Oliveira

Exceções no Fluxo de Execução: Interrupções e Traps

José Augusto Fabri. Assembly Básico

Microprocessadores CPU. Unidade de Controle. Prof. Henrique

Antes de deixarmos o hardware (1) Nível da Arquitetura do Conjunto das Instruções

14/3/2016. Prof. Evandro L. L. Rodrigues

Revisão da Linguagem C Prof. Evandro L. L. Rodrigues

Tópicos em C. Eliade F. Lima

A Linguagem C. A forma de um programa em C

Revisão Linguagem C Parte 1

Ordenação dos bytes na memória O IA32 é um processador little endian Exemplo: representação de 0x , cujo endereço dado por &x é 0x100

Arquitetura da FPU Intel

Assembly do IA-32 em ambiente Linux

Arquitecturas Alternativas. Java Virtual Machine

Lab. de Programação Concorrente em Física Primeira Prática

Sistemas Operacionais. Pilha de Execução Volnys B. Bernal 1. Agenda. Pilha de execução. Os problemas. Os problemas.

Organização de Computadores 1

William Stallings Arquitetura e Organização de Computadores 8 a Edição

INTRODUÇÃO À LINGUAGEM C

Introdução à Computação MAC0110

SEL-433 APLICAÇÕES DE MICROPROCESSADORES I

Símbolos e abreviaturas utilizadas na descrição das instruções

Transcrição:

Programando em Assembly precisa-se saber exatamente como interpretar & gerenciar a memória e como usar instruções de baixo nível para o processamento Não existem tipos e variáveis (apenas bytes na memória) não tem-se o auxílio da verificação de tipos do compilador, que ajudam a detectar vários erros código assembly é altamente dependente da máquina -> perde-se a portabilidade de uma linguagem de alto nível Geração de Código objeto Arquivos fonte p1.c p2.c Comando de compilação: gcc -O p1.c p2.c -o p Otimizações (-O) text C program (p1.c p2.c) Compiler (gcc -S) text Asm program (p1.s p2.s) Assembler (gcc or as) ) binary binary Object program (p1.o p2.o) Linker (gcc or ld) Executable program (p) Static libraries (.a)

Diferenças entre assemblers Formato Intel/Microsoft lea sub cmp mov eax,[ecx+ecx*2] esp,8 dword ptr [ebp-8],0 eax,dword ptr [eax*4+100h] Formato GAS/Gnu leal (%ecx,%ecx,2),%eax subl $8,%esp cmpl $0,-8(%ebp) movl $0x100(,%eax,4),%eax Diferenças Intel/Microsoft X GAS Operandos em ordem contrária mov Dest, Src movl Src, Dest Constantes não precedidas pelo $, hexadecimais com h no final 100h $0x100 Tamanho do operando indicado por operando ou sufixo de instrução sub subl entre outros Visão do programador Assembly CPU Registradores EFLAGS A L U PC Endereços Dados Instruções Memória Codigo objeto Dados do programa Bibliotecas Dados do S.O. Estado da CPU PC Program Counter Endereço da próxima instrução Registradores Acesso rápido a dados/endereços Registrador EFLAGS (Códigos de condição) Armazena informação sobre resultado da última operação artimética (overflow?, zero?, negativo?) Usados para desvios condicionais Pilha (Stack) Memória plana Array de bytes endereçáveis Contém código, dados e pilha Pilha usada para gerenciar chamada a procedimentos

Características do Assembly Tipos de dados básicos integer de 1, 2, ou 4 bytes Valores int, short, long int, char Endereços (equivalente a untyped pointer) Dados em ponto flutuante de 4, 8, ou 10 bytes Não existem tipos de dados complexos como arrays ou structs Apenas bytes alocados de forma contígua na memória Operações primitivas Funções aritméticas sobre o conteúdo de registradores ou dados na memória Transferência de dados d (mov) entre memória e registradores Carregar dado de memória para registrador Armazenar dado em registrador para memória Controle de fluxo de execução Desvios (jump) incondicionais Desvios condicionais (dependendo de um bit em EFLAGS) Registradores de Propósito Geral São usados para armazenamento temporário de dados e endereços da memória (uso: %nome) Capacidade: 32 bits (=word do IA32) Todos podem armazenar tb. dados menores: %eax 32 %ax %ah %al %esp e %ebp reservados para uso especial ( p de ponteiro) Exemplos: movl %edx, %eax incl %ecx addl %eax, $0xff 16 8 %eax %edx %ecx %ebx %esi %edi %esp %ebp %edx %eax %ecx+1 %ecx %eax+255 %eax

O Registrador EFLAGS Seus bits indicam a ocorrência de eventos (bit carry) ou o resultado da última operação aritmética, p.ex. t = a+b: OF SF ZF CF PF... OF (Overflow flag)=1 se houve overflow (negativo ou positivo) de representação com sinal SZ (Sign flag)=1 se t < 0 ZF (Zero flag)=1 se t ==0 CF (Carry flag)=1 se houve overflow de unsigned PF (Parity flag)=1 se o byte menos significativo possui o número par de bits 1 Os bits de EFLAGS são consultados por instruções de desvio condicional Transferência de bytes Instrução mais frequente movl fonte, destino Operando fonte pode ser: Conteúdo de registrador modo registrador Conteúdo de memória apontado por registrador modo memória Constante modo imediato Símbolo modo direto Combinações dos anteriores Operando destino pode ser: Registrador Memória apontada por registrador Combinações dos anteriores Obs: Operando em modo memória é caracterizado pelo uso de parenteses ( ) Exemplo: movl (%ebx), %ecx // Mem(ebx) R ecx

Combinações de operandos de movl Fonte Destino Exemplo Equiv. em C Imed Reg Mem movl $0x4,%eax movl $-147,(%eax) temp = 0x4; *p = -147; movl Reg Reg Mem movl %eax,%edx movl %eax,(%edx) temp2 = temp1; *p = temp; Mem Reg movl (%eax),%edx temp = *p; Obs: Não é possível fazer transferência direta memória-memória com uma única instrução Modo registrador movl %eax, %ecx Exemplos // R eax R ecx Modo imediato movl $Ox100, %eax // const R eax Modo memória forma: base (reg) movl %eax, 16(%ecx) // R eax Mem[16+R ecx ] movl %eax, (%ecx) // R eax Mem[R ecx] ] Modo direto movl table, %ebx // Mem[table] R ebx

Todas as formas de operandos Figura 3.3 (p.137) Sufixos Para muitas instruções existem várias variantes, definidas pelo seu sufixo (e.g. movl, addl, decl) Sufixo indica o tamanho do operando (resultado é armazenado alinhado com o byte menos significativo) b = tamanho é de 1 byte movb $0, (%eax) //0 Mem[R eax ] w = tamanho é de 2 bytes movw $0, (%eax) l = tamanho de 4 bytes movl $0, (%eax)

Grupos de Instruções Movimento de dados Aritmética inteira Instruções lógicas Instruções de controle de fluxo Instruções em ponto flutuante Exemplos: Aritmética Inteira & Instruções Lógicas Instruções de dois operandos Formato Efeito addl Src,Dest Dest + Src Dest subl Src,Dest Dest Src Dest imull Src,Dest Dest * Src Dest sall Src,Dest Dest << Src Dest sarl Src,Dest Dest >> Src Dest aritmético shrl Src,Dest Dest >> Src Dest lógico xorl Src,Dest Dest ^ Src Dest xor bit-a-bit andl Src,Dest Dest & Src Dest and bit-a-bit orl Src,Dest Dest Src Dest or bit-a-bit

Exemplos: Aritmética Inteira & Instruções Lógicas Instruções de um operando Formato Efeito incl Dest Dest + 1 Dest decl Dest Dest 1 Dest negl Dest - Dest Dest notl Dest ~ Dest Dest Declaração de Dados Assembler do gcc permite declaração de variáveis i de vários tipos (na seção de dados.data). Exemplos: vet:.byte 48, 0b00110000, 0x30, 0 s1:.string o resultado eh de %d\n

Resumo: Máquinas abstratas Modelos de máquinas Dados memória Ling. C procedimentos 1) Char 2) short 2) int, float 3) double 4) struct, array 5) pointer Assembly mem regs alu Stack Cond. Codes processor 1) Byte 2) 2-byte word 2) 4-byte word 3) 8-byte long word 4) Alocação contígua de bytes 5) Endereço do byte inicial Tentem entender... void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; } Exercício swap: pushl %ebp movl %esp,%ebp pushl %ebx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx),%eax movl (%edx),%ebx movl %eax,(%edx) movl %ebx,(%ecx) movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret Inicialização (ignorar) yp xp Finalização (ignorar)