aula-assembly.ppt

41
ASSEMBLY – aula 2 ASSEMBLY – aula 2 Hugo Calazans Hugo Calazans André Ricardo André Ricardo

Upload: anakarolina

Post on 14-Sep-2015

6 views

Category:

Documents


1 download

TRANSCRIPT

  • ASSEMBLY aula 2Hugo CalazansAndr Ricardo

  • Roteiro1- Intel x AT&T2- Pilha e command line arguments3- Procedimentos4- Simulando alguns comandos C5- Assembly inline6- Criando um projeto C/C++ no eclipse7- Exemplos de cdigo c/c++8- Exemplos de cdigo Assembly inline9- Linux Man Pages10- Referncias

  • Intel x AT&TDiferenas:1- Ordenao entre source e destination2- Nome dos registradores3- Operandos imediatos (immediate)4- Tamanho dos operandos5- Operandos na memria

  • Intel x AT&T

    Intel CodeAT&T Codemov eax,1mov ebx,0ffhint 80hmov ebx, eaxmov eax,[ecx]mov eax,[ebx+3]mov eax,[ebx+20h]add eax,[ebx+ecx*2h]lea eax,[ebx+ecx]sub eax,[ebx+ecx*4h-20h]movl $1,%eaxmovl $0xff,%ebxint $0x80movl %eax, %ebxmovl (%ecx),%eaxmovl 3(%ebx),%eaxmovl 0x20(%ebx),%eaxaddl (%ebx,%ecx,0x2),%eaxleal (%ebx,%ecx),%eaxsubl -0x20(%ebx,%ecx,0x4),%eax

  • Intel x AT&T- Exemplo: FatorialC

    int fatorial (int numero) {int y = 1;if (numero

  • Intel x AT&T- Exemplo: FatorialIntel

    .globl mainmain:mov eax, 5mov ebx, 1L1: cmp eax, 0 //compara 0 com o valor em eaxje L2 //pula p/ L2 se 0==eax (je pula se igual)imul ebx, eax // ebx = ebx*eaxdec eax //decrementa eaxjmp L1 // pulo incondicional para L1L2: ret

  • Intel x AT&T- Exemplo: FatorialAT&T

    .globl mainmain:movl $5, %eaxmovl $1, %ebxL1: cmpl $0, %eax //compara 0 com o valor em eaxje L2 //pula p/ L2 se 0==eax (je pula se igual)imull %eax, %ebx // ebx = ebx*eaxdecl %eax //decrementa eaxjmp L1 // pulo incondicional para L1L2: ret

  • Intel x AT&T- Exemplo: Ponto de entradaNASM

    section .data

    section .text global _start

    _start: push epbmov ebp,esppush ebxpush esipush edi

    ; cdigo do seu programa

    pop edipop esipop ebxmov esp,ebppop ebp

  • Intel x AT&T- Exemplo: Ponto de entradaAT&T

    .data

    .globl main

    main: pushl %epbmovl %ebp,%esppushl %ebxpushl %esipushl %edi

    ; cdigo do seu programa

    popl %edipopl %esipopl %ebxmovl %esp,%ebppopl %ebp

  • Pilha e Argumentos de linha de comandoExemplo:./programa infra software 677

    PILHA4programainfrasoftware677

  • Pilha e Argumentos de linha de comandoExemplo:./programa infra software 677

    INTELAT&TO que ?pop eaxpop ebxpop ecxpop edxpop eaxpop %eaxpop %ebxpop %ecxpop %edxpop %eax# de argsprogramainfrasoftware677

  • Procedimentos?Diferentemente do TASM, NASM no possui o conceito de procedimentoTudo Label!Nada de keywords "proc" ou "endp"basta colocar uma labelBoa prticacomentrios delimitando o bloco de cdigo

  • Procedimentos?No DOS, sim!DOS

    proc fileWrite: mov ah, 40h mov bx, [filehandle] mov cl, [stuffLen] mov dx, offset stuffToWrite int 21h retendp fileWrite

  • Procedimentos?No Linux, no. Labels!INTEL

    fileWrite: mov eax,4 mov ebx, [filedesc] mov ecx, stuffToWrite mov edx, [stuffLen] int 80h ret ; endp fileWriteAT&T

    fileWrite: movl $4, %eaxmovl ($filedesc), %ebx movl $stuffToWrite, %ecx movl ($stuffLen), %edx int $0x80 ret ; endp fileWrite

  • Gerando Cdigo AssemblyComo gerar cdigo assembly de um programa escrito em C?gcc -S nomeDoPrograma.cSer gerado um arquivo assembly com o nome nomeDoPrograma.sEstratgia muito boa para se aprender assemblyConstruir programas em C e compilar com o parmetro -S para gerar o cdigo .s

  • Simulando comandos C- If-then-elseC

    if (EAX == 'w') { writeFile();} else { doSomethingElse();}NASM

    cmp eax, 'w'jneskipWrite ; Se no, skip

    callwriteFilejmp outOfThisMess

    skipWrite:call doSomethingElse

    outOfThisMess: ...; resto do programa

  • Simulando comandos C- If-then-elseC

    if (EAX == 'w') { writeFile();} else { doSomethingElse();}AT&T

    cmpl 'w, %eaxjneskipWrite ; Se no, skip

    callwriteFilejmp outOfThisMess

    skipWrite:call doSomethingElse

    outOfThisMess: ...; resto do programa

  • Simulando comandos C- whileC

    int i = 0;

    while(i< 100){i = i + 1;}NASM

    mov eax, 0whileLoop:mov ebx, 100cmp eax, ebxjge WhileTerminadoinc eaxjmp WhileLoop

    WhileTerminado:;resto do cdigo

  • Simulando comandos C- whileC

    int i = 0;

    while(i< 100){i = i + 1;}AT&T

    movl $0, %eaxwhileLoop:movl $100, %ebxcmpl %ebx, %eaxjge WhileTerminadoincl %eaxjmp WhileLoop

    WhileTerminado:;resto do cdigo

  • Assembly Inline- funes inline em CO que inline function?Uma forma de instruir o compilador a inserir o cdigo de uma determinada funo dentro do cdigo de quem a chama

  • Assembly Inline- funes inline em CBenefciosReduo do overhead existente para a chamada de uma funoPossvel simplificaes em tempo de compilao, de forma que no necessariamente todo o cdigo da funo inline precise ser includo

  • Assembly Inline- funes inline em CDesvantagensPossvel aumento do tamanho do cdigoComo usar?Colocando a palavra chave inline na declarao da funo

  • Assembly InlineRotinas assembly escritas como funes inline

    CaractersticasConvenientesVelozesAmplamente utilizadas na programaes de sistemas

  • Assembly InlineComo declarar?asm("assembly code"); ImportnciaAtua como interface entre funes assembly e os programas C que as contmAtuao sobre operandos e produo de resultados visveis para variveis C

  • Assembly InlineExemplo 1:Move o contedo de ecx para eax: __asm__("movl %ecx, %eax");

    Exemplo 2:Move o contedo de ecx para o endereo da memria apontado por eax:asm("movb %ecx, (%eax)");}

    Observe nos dois exemplos acima a possibilidade de se utilizar __asm__(cdigo) ou asm(cdigo)

  • Assembly InlineNo caso de mais de uma instruo:Escreve-se uma por linhaEntre aspasCom o sufixo \n\t ao final da instruoIsso se deve ao fato de que GCC envia cada instruo como uma String ao GNU Assembler

  • Assembly InlineExemplo 3: #include int main(){__asm__ ("movl %eax, %ebx\n\t"movl $56, %esi\n\t"movl %ecx, $label(%edx,%ebx,$4)\n\t" "movb %ah, (%ebx)");}

  • Assembly InlineExemplo 4: #include int main(){ __asm__("movl$1,%eax// SYS_exit xor %ebx,%ebxint $0x80 ");}

  • Criando um projeto C/C++ no eclipse

  • Exemplo Cdigo C/C++

  • Executando a aplicao

  • Hello World usando Interrupes

  • Chamando funes externas

  • Chamando funes externas (mltiplos parametros)

  • Chamando funes externas (mltiplos parametros)

  • Obtendo o tempo de sistema

  • Criando e Modificando Arquivos

  • Linux Man PagesO que so?documentao extensiva presente na maior parte dos SOs da famlia UNIXComandoman tima referncia para system callsSection 2Executadas a partir do servio de interr 80h

  • Linux Man Pages- Organizao tpica1. General Commands2. System Calls3. Subroutines4. Special Files5. File Formats6. Games and screensavers7. Macros and Conventions8. Maintenence Commands

  • Linux Man PagesA partir do terminal do unix:Exemplo: digite man 2 writeOnline:http://www.linuxmanpages.com/http://man.he.net/http://www.die.net/doc/linux/man/

  • Assembly Referncias

    http://www/~htcrs/if677/assembly/referencias.txt