Assembly

844 visualizações

Publicada em

aprendendo a programação assembly

Publicada em: Engenharia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
844
No SlideShare
0
A partir de incorporações
0
Número de incorporações
5
Ações
Compartilhamentos
0
Downloads
32
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Assembly

  1. 1. ASSEMBLYASSEMBLY Lucas AranhaLucas Aranha lab3@cin.ufpe.brlab3@cin.ufpe.br
  2. 2. AssemblyAssembly  Assembly é uma linguagem de baixoAssembly é uma linguagem de baixo nível, chamada freqüentemente denível, chamada freqüentemente de “linguagem de montagem”“linguagem de montagem”  É uma linguagem considerada difícil,É uma linguagem considerada difícil, principalmente porque o programadorprincipalmente porque o programador precisa conhecer a estrutura daprecisa conhecer a estrutura da máquina para usá-lamáquina para usá-la
  3. 3. AssemblyAssembly  A linguagem Assembly é atrelada àA linguagem Assembly é atrelada à arquitetura de uma certa CPU, ouarquitetura de uma certa CPU, ou seja, ela depende completamente doseja, ela depende completamente do hardwarehardware  Por essa razão Assembly não é umaPor essa razão Assembly não é uma linguagem portável, ao contrário dalinguagem portável, ao contrário da maioria das linguagens de alto nívelmaioria das linguagens de alto nível
  4. 4. Assembly - HistóriaAssembly - História  As primeiras linguagens Assembly surgiramAs primeiras linguagens Assembly surgiram na década de 50, na chamada segundana década de 50, na chamada segunda geração das linguagens de programaçãogeração das linguagens de programação  A segunda geração visou libertar osA segunda geração visou libertar os programadores de dificuldades comoprogramadores de dificuldades como lembrar códigos numéricos e calcularlembrar códigos numéricos e calcular endereçosendereços
  5. 5. Assembly - HistóriaAssembly - História  Assembly foi muito usada para váriasAssembly foi muito usada para várias aplicações até os anos 80, quando foiaplicações até os anos 80, quando foi substituída pelas linguagens de altosubstituída pelas linguagens de alto nívelnível  Isso aconteceu principalmente pelaIsso aconteceu principalmente pela necessidade de aumento danecessidade de aumento da produtividade de softwareprodutividade de software
  6. 6. Assembly - HistóriaAssembly - História  Atualmente Assembly é usada paraAtualmente Assembly é usada para manipulação direta de hardware e paramanipulação direta de hardware e para sistemas que necessitem de performancesistemas que necessitem de performance críticacrítica  Device drivers, sistemas embarcados deDevice drivers, sistemas embarcados de baixo nível e sistemas de tempo real sãobaixo nível e sistemas de tempo real são exemplos de aplicações que usamexemplos de aplicações que usam AssemblyAssembly
  7. 7. Assembly - AssemblerAssembly - Assembler  A linguagem Assembly é de baixoA linguagem Assembly é de baixo nível, porém ainda precisa sernível, porém ainda precisa ser transformada na linguagem que atransformada na linguagem que a máquina entendemáquina entende  Quem faz isso é o Assembler. OQuem faz isso é o Assembler. O Assembler é um utilitário que traduz oAssembler é um utilitário que traduz o código Assembly para a máquinacódigo Assembly para a máquina
  8. 8. Assembly - AssemblerAssembly - Assembler  Exemplo:Exemplo: Antes -> mov al, 061h (Antes -> mov al, 061h (x86x86//IA-32IA-32)) Depois -> 10110000 01100001Depois -> 10110000 01100001
  9. 9. Assembly -Assembly - FundamentosFundamentos  Byte, Word e Dword são blocos deByte, Word e Dword são blocos de dados básicos. O processadordados básicos. O processador trabalha com o tamanho de dadostrabalha com o tamanho de dados adequados para executar asadequados para executar as instruçõesinstruções  Um byte possui 8 bits, um word possuiUm byte possui 8 bits, um word possui 16 bits ou 2 bytes e um dword possui16 bits ou 2 bytes e um dword possui 32 bits ou 4 bytes32 bits ou 4 bytes
  10. 10. Assembly -Assembly - FundamentosFundamentos  Em Assembly é comum representar osEm Assembly é comum representar os números na forma hexadecimal. Issonúmeros na forma hexadecimal. Isso acontece porque é interessante visualizar oacontece porque é interessante visualizar o número na forma de dadosnúmero na forma de dados  A representação hexadecimal facilita oA representação hexadecimal facilita o tratamento de números muito grandes etratamento de números muito grandes e permite saber quais bits estão “ligados” oupermite saber quais bits estão “ligados” ou “desligados”“desligados”
  11. 11. Assembly -Assembly - FundamentosFundamentos  Um algarismo hexadecimal pode serUm algarismo hexadecimal pode ser representado por quatro algarismosrepresentado por quatro algarismos bináriosbinários  Logo um byte pode ser representadoLogo um byte pode ser representado como dois números hexa, um wordcomo dois números hexa, um word como quatro números hexa e umcomo quatro números hexa e um dword como oito números hexadword como oito números hexa
  12. 12. Assembly -Assembly - FundamentosFundamentos BinárioBinário HexaHexa DecimalDecimal TipoTipo 1000000010000000 8080 128128 bytebyte 10000000000001000000000000 001001 80018001 32.76932.769 wordword 11111111111111111111111111 111111 FFFFFFFF 65.53565.535 wordword 11111111111111111111111111 11111111111111111111111111 111111111111 FFFFFFFFFFFFFF FF 4.294.967.4.294.967. 295295 dworddword
  13. 13. Assembly -Assembly - RegistradoresRegistradores  Registradores são áreas especiaisRegistradores são áreas especiais dentro do processador que são maisdentro do processador que são mais rápidas que operandos de memória.rápidas que operandos de memória.  Como vamos trabalhar com oComo vamos trabalhar com o processador Intel, existem apenas 8processador Intel, existem apenas 8 registradores de uso geralregistradores de uso geral
  14. 14. Assembly -Assembly - RegistradoresRegistradores  São eles:São eles: EAX, EBX, ECX, EDX, ESI, EDI, ESP,EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBPEBP  Os registradores ESP e EBP sóOs registradores ESP e EBP só devem ser usados preferencialmentedevem ser usados preferencialmente para trabalhar com a pilhapara trabalhar com a pilha
  15. 15. Assembly -Assembly - RegistradoresRegistradores  Nos registradores de uso geral (Exceto ESINos registradores de uso geral (Exceto ESI e EDI) é permitido usar três modos dee EDI) é permitido usar três modos de acesso diferentes, ilustrados pela figuraacesso diferentes, ilustrados pela figura abaixo:abaixo:
  16. 16. Assembly -Assembly - RegistradoresRegistradores  EAX -> Chamado de “Acumulador”,EAX -> Chamado de “Acumulador”, geralmente é usado para operaçõesgeralmente é usado para operações aritméticas e para guardar resultadosaritméticas e para guardar resultados  EBX -> Chamado de “Base”,EBX -> Chamado de “Base”, geralmente é usado para armazenargeralmente é usado para armazenar dados em geral e para endereços dedados em geral e para endereços de memóriamemória
  17. 17. Assembly -Assembly - RegistradoresRegistradores  ECX -> Chamado de “Contador”,ECX -> Chamado de “Contador”, como o nome já diz é usado comocomo o nome já diz é usado como contador, principalmente paracontador, principalmente para controlar loopscontrolar loops  EDX -> Chamado de registrador deEDX -> Chamado de registrador de dados, é usado geralmente paradados, é usado geralmente para guardar o endereço de uma variávelguardar o endereço de uma variável na memóriana memória
  18. 18. Assembly -Assembly - RegistradoresRegistradores  ESI e EDI -> Respectivamente “SourceESI e EDI -> Respectivamente “Source Index” e “Destination Index”, são menosIndex” e “Destination Index”, são menos usados do que os registradores descritosusados do que os registradores descritos anteriormente. Geralmente usa-se ESI eanteriormente. Geralmente usa-se ESI e EDI para movimentação de dados, com ESIEDI para movimentação de dados, com ESI guardando o endereço fonte de umaguardando o endereço fonte de uma variável e EDI guardando o endereçovariável e EDI guardando o endereço destino. Não podem ser acessados emdestino. Não podem ser acessados em nível de Byte.nível de Byte.
  19. 19. Assembly -Assembly - RegistradoresRegistradores  ESP e EBP -> RespectivamenteESP e EBP -> Respectivamente “Stack Pointer” e “Base Pointer”, só“Stack Pointer” e “Base Pointer”, só devem ser usados para manipulaçãodevem ser usados para manipulação da pilha. O Registrador ESP guarda ada pilha. O Registrador ESP guarda a referência para o topo da pilha,referência para o topo da pilha, enquanto o registrador EBP é usadoenquanto o registrador EBP é usado para “andar” pela pilhapara “andar” pela pilha
  20. 20. Assembly -Assembly - RegistradoresRegistradores  Entre os registradores que não são de usoEntre os registradores que não são de uso geral, existe um registrador muito relevantegeral, existe um registrador muito relevante para o programador, o registrador flagspara o programador, o registrador flags  Através do registrador flags podemos saberAtravés do registrador flags podemos saber se dois valores são iguais, se um é maiorse dois valores são iguais, se um é maior que outro ou se um valor é negativo, alémque outro ou se um valor é negativo, além de outras informaçõesde outras informações
  21. 21. Assembly -Assembly - RegistradoresRegistradores  O => OverflowO => Overflow  D => DirectionD => Direction  I => Interrupt EnableI => Interrupt Enable  T => TrapT => Trap  S => SignalS => Signal
  22. 22. Assembly -Assembly - RegistradoresRegistradores  Z => ZeroZ => Zero  A => Auxiliar CarryA => Auxiliar Carry  P => ParityP => Parity  C => CarryC => Carry
  23. 23. Assembly - PilhaAssembly - Pilha  Todos os programas fazem uso da pilha emTodos os programas fazem uso da pilha em tempo de execução, porém nas linguagenstempo de execução, porém nas linguagens de alto nível não é preciso se preocuparde alto nível não é preciso se preocupar com o funcionamento da pilhacom o funcionamento da pilha  Já em Assembly, o programador precisaJá em Assembly, o programador precisa saber trabalhar com a pilha, pois ela é umasaber trabalhar com a pilha, pois ela é uma ferramenta importanteferramenta importante
  24. 24. Assembly - PilhaAssembly - Pilha  A pilha é uma área de dados existenteA pilha é uma área de dados existente na memória em tempo de execução,na memória em tempo de execução, na qual seu programa podena qual seu programa pode armazenar dados temporariamentearmazenar dados temporariamente • O processador é rápido no acesso àO processador é rápido no acesso à pilha, tanto para escrever quanto parapilha, tanto para escrever quanto para lerler
  25. 25. Assembly - PilhaAssembly - Pilha  As principais funcionalidades da pilha são:As principais funcionalidades da pilha são: - Preservar valores de registradores em- Preservar valores de registradores em funçõesfunções - Preservar dados da memória- Preservar dados da memória - Transferir dados sem usar registradores- Transferir dados sem usar registradores - Reverter a ordem de dados- Reverter a ordem de dados - Chamar outras funções e depois retornar- Chamar outras funções e depois retornar - Passar parâmetros para funções- Passar parâmetros para funções
  26. 26. Assembly - InstruçõesAssembly - Instruções  Movimentação de dados:Movimentação de dados: - mov destino, fonte (Sintaxe Intel)- mov destino, fonte (Sintaxe Intel) - mov fonte, destino (Sintaxe AT&T)- mov fonte, destino (Sintaxe AT&T)  Obs: Nas instruções AT&T, é necessárioObs: Nas instruções AT&T, é necessário informar o tamanho do dado com que seinformar o tamanho do dado com que se está trabalhandoestá trabalhando
  27. 27. Assembly - InstruçõesAssembly - Instruções Intel AT&T mov eax, 1 movl $1, %eax mov ebx, 0ffh movl $0xff, %ebx mov eax, [ebx] movl (%ebx), %eax mov eax, [ebx+3] movl 3(%ebx), %eax
  28. 28. Assembly - InstruçõesAssembly - Instruções  Instrução de soma:Instrução de soma: - add destino, fonte (Sintaxe Intel)- add destino, fonte (Sintaxe Intel) Exemplo: add eax,[ebx+ecx]Exemplo: add eax,[ebx+ecx] - add fonte, destino (Sintaxe AT&T)- add fonte, destino (Sintaxe AT&T) Exemplo: addl (%ebx,%ecx),%eaxExemplo: addl (%ebx,%ecx),%eax
  29. 29. Assembly - InstruçõesAssembly - Instruções  Instrução de subtração:Instrução de subtração: - sub destino, fonte (Sintaxe Intel)- sub destino, fonte (Sintaxe Intel) Exemplo: sub eax,ebxExemplo: sub eax,ebx - sub fonte, destino (Sintaxe AT&T)- sub fonte, destino (Sintaxe AT&T) Exemplo: subl %ebx,%eaxExemplo: subl %ebx,%eax
  30. 30. Assembly - InstruçõesAssembly - Instruções  Instruções de operações lógicas:Instruções de operações lógicas: - and/or/xor destino, fonte (Sintaxe Intel)- and/or/xor destino, fonte (Sintaxe Intel) Exemplo: and ax,bxExemplo: and ax,bx - and/or/xor fonte, destino (Sintaxe AT&T)- and/or/xor fonte, destino (Sintaxe AT&T) Exemplo: andw %bx,%axExemplo: andw %bx,%ax
  31. 31. Assembly - IntruçõesAssembly - Intruções  Instrução de comparação:Instrução de comparação: - cmp operando1, operando2 (Sintaxe- cmp operando1, operando2 (Sintaxe Intel)Intel) Exemplo: cmp 08h, eaxExemplo: cmp 08h, eax - cmp operando1, operando2 (Sintaxe- cmp operando1, operando2 (Sintaxe AT&T)AT&T) Exemplo: cmp $0x8, %eaxExemplo: cmp $0x8, %eax
  32. 32. Assembly - InstruçõesAssembly - Instruções  Instruções de jump:Instruções de jump: ““Pulo” incondicional:Pulo” incondicional: - jmp [100] (Sintaxe Intel)- jmp [100] (Sintaxe Intel) - jmp eax (Sintaxe Intel)- jmp eax (Sintaxe Intel) - jmp *100 (Sintaxe AT&T)- jmp *100 (Sintaxe AT&T) - jmp *%eax (Sintaxe AT&T)- jmp *%eax (Sintaxe AT&T)
  33. 33. Assembly - InstruçõesAssembly - Instruções ““Pulo” condicional:Pulo” condicional: - je [100] (Sintaxe Intel)- je [100] (Sintaxe Intel) - jne eax (Sintaxe Intel)- jne eax (Sintaxe Intel) - je *100 (Sintaxe AT&T)- je *100 (Sintaxe AT&T) - jne *%eax (Sintaxe AT&T)- jne *%eax (Sintaxe AT&T)
  34. 34. Assembly - InstruçõesAssembly - Instruções  Instruções de manipulação da pilha:Instruções de manipulação da pilha: - push eax (Sintaxe Intel)- push eax (Sintaxe Intel) - push %eax (Sintaxe AT&T)- push %eax (Sintaxe AT&T) - pop eax (Sintaxe Intel)- pop eax (Sintaxe Intel) - pop %eax (Sintaxe AT&T)- pop %eax (Sintaxe AT&T)
  35. 35. Assembly - SeçõesAssembly - Seções  O código Assembly é dividido em seções.O código Assembly é dividido em seções. As principais seções no Linux são:As principais seções no Linux são: - section .data -> A seção .data é usada para- section .data -> A seção .data é usada para declarar variáveis inicializadas. Porémdeclarar variáveis inicializadas. Porém essas “variáveis” não mudam no decorreressas “variáveis” não mudam no decorrer do programa. Essa seção é usadado programa. Essa seção é usada geralmente para definir nomes de arquivos,geralmente para definir nomes de arquivos, constantes, entre outros.constantes, entre outros.
  36. 36. Assembly - SeçõesAssembly - Seções - Exemplo:- Exemplo: section .datasection .data mensagem: db 'Hello world!'mensagem: db 'Hello world!' msglength: equ 12msglength: equ 12
  37. 37. Assembly - SeçõesAssembly - Seções - section .bss -> É a seção usada para- section .bss -> É a seção usada para declarar as variáveis do programadeclarar as variáveis do programa - Exemplo:- Exemplo: section .bsssection .bss nomearq: resb 230 ;Reserva 230 bytesnomearq: resb 230 ;Reserva 230 bytes numero: resb 1 ;Reserva 1 bytenumero: resb 1 ;Reserva 1 byte array: resw 10 ;Reserva 10 wordsarray: resw 10 ;Reserva 10 words
  38. 38. Assembly - SeçõesAssembly - Seções - section .text -> Essa é a seção onde o código do- section .text -> Essa é a seção onde o código do programa é escritoprograma é escrito - Exemplo:- Exemplo: section .textsection .text global _startglobal _start _start:_start: .. . .. . .. . .. . .. . .. .
  39. 39. Assembly – InterrupçõesAssembly – Interrupções  Interrupções são chamadas aoInterrupções são chamadas ao processador requisitando um serviçoprocessador requisitando um serviço  O nome interrupção vem do fato deO nome interrupção vem do fato de que o processador tem sua atividadeque o processador tem sua atividade atual interrompida quando recebe umatual interrompida quando recebe um sinal de chamadasinal de chamada
  40. 40. Assembly - InterrupçõesAssembly - Interrupções  Quando isso acontece, o processador salvaQuando isso acontece, o processador salva o processo atual e executa a rotina daquelao processo atual e executa a rotina daquela interrupçãointerrupção  Após a execução da rotina, que geralmenteApós a execução da rotina, que geralmente está armazenada em uma tabela naestá armazenada em uma tabela na memória RAM, o processador retorna aomemória RAM, o processador retorna ao processo em que estava anteriormenteprocesso em que estava anteriormente
  41. 41. Assembly - InterrupçõesAssembly - Interrupções  Para se chamar uma interrupção no Linux,Para se chamar uma interrupção no Linux, é feito o seguinte processo:é feito o seguinte processo: - Coloca-se o número da interrupção no- Coloca-se o número da interrupção no registrador EAXregistrador EAX - Coloca-se os argumentos requeridos pela- Coloca-se os argumentos requeridos pela interrupção nos devidos registradoresinterrupção nos devidos registradores - Chama-se a interrupção- Chama-se a interrupção  O resultado geralmente será retornado emO resultado geralmente será retornado em EAXEAX
  42. 42. Assembly - InterrupçõesAssembly - Interrupções - Exemplo (Sintaxe Intel):- Exemplo (Sintaxe Intel): mov eax,1 ; Interrupção Exitmov eax,1 ; Interrupção Exit mov ebx,0 ; Argumento em EBXmov ebx,0 ; Argumento em EBX int 80h ; Chamada da interrupçãoint 80h ; Chamada da interrupção - Exemplo (Sintaxe AT&T):- Exemplo (Sintaxe AT&T): movl $1,%eaxmovl $1,%eax movl $0, %ebxmovl $0, %ebx int $0x80int $0x80
  43. 43. Assembly - ExemploAssembly - Exemplo  Hello World (Sintaxe Intel)Hello World (Sintaxe Intel) section .datasection .data hello: db 'Hello world!',10 ; A string 'Hello World!‘ e um linefeedhello: db 'Hello world!',10 ; A string 'Hello World!‘ e um linefeed helloLenght: equ $-hello ; Tamanho da string hellohelloLenght: equ $-hello ; Tamanho da string hello section .textsection .text global _startglobal _start _start:_start: mov eax,4 ; Interrupção de escrita (sys_write)mov eax,4 ; Interrupção de escrita (sys_write) mov ebx,1 ; Argumento que indica onde a string vai ser escritamov ebx,1 ; Argumento que indica onde a string vai ser escrita mov ecx,hello ; Argumento que indica o endereço da stringmov ecx,hello ; Argumento que indica o endereço da string mov edx,helloLenght ; Argumento que indica o tamanho da stringmov edx,helloLenght ; Argumento que indica o tamanho da string int 80h ; Chamada da interrupçãoint 80h ; Chamada da interrupção mov eax,1 ; Interrupção exit (sys_exit)mov eax,1 ; Interrupção exit (sys_exit) mov ebx,0 ; Argumento da interrupçãomov ebx,0 ; Argumento da interrupção int 80h ; Chamada da interrupçãoint 80h ; Chamada da interrupção
  44. 44. Assembly - ExemploAssembly - Exemplo  Hello World (Sintaxe AT&T)Hello World (Sintaxe AT&T) .data.data hello: .string "Hello World!n"hello: .string "Hello World!n" .text.text .globl main.globl main main:main: mov $4,%eaxmov $4,%eax mov $1,%ebxmov $1,%ebx mov $hello,%ecxmov $hello,%ecx mov $13,%edxmov $13,%edx int $0x80int $0x80 mov $1,%eaxmov $1,%eax mov $0,%ebxmov $0,%ebx int $0x80int $0x80
  45. 45. Assembly – ReferênciasAssembly – Referências www.cin.ufpe.br/~lab3www.cin.ufpe.br/~lab3 No meu public estarei atualizando oNo meu public estarei atualizando o arquivo “Links-if677.txt” sempre quearquivo “Links-if677.txt” sempre que encontrar referências interessantesencontrar referências interessantes

×