45
ASSEMBLY ASSEMBLY Lucas Aranha Lucas Aranha [email protected] [email protected]

ASSEMBLY

  • Upload
    sani

  • View
    49

  • Download
    0

Embed Size (px)

DESCRIPTION

ASSEMBLY. Lucas Aranha [email protected]. Assembly. Assembly é uma linguagem de baixo nível, chamada freqüentemente de “linguagem de montagem” É uma linguagem considerada difícil, principalmente porque o programador precisa conhecer a estrutura da máquina para usá-la. Assembly. - PowerPoint PPT Presentation

Citation preview

Page 1: ASSEMBLY

ASSEMBLYASSEMBLY

Lucas AranhaLucas Aranha

[email protected]@cin.ufpe.br

Page 2: ASSEMBLY

AssemblyAssembly

Assembly é uma linguagem de Assembly é uma linguagem de baixo nível, chamada baixo nível, chamada freqüentemente de “linguagem freqüentemente de “linguagem de montagem”de montagem”

É uma linguagem considerada É uma linguagem considerada difícil, principalmente porque o difícil, principalmente porque o programador precisa conhecer a programador precisa conhecer a estrutura da máquina para usá-la estrutura da máquina para usá-la

Page 3: ASSEMBLY

AssemblyAssembly

A linguagem Assembly é atrelada A linguagem Assembly é atrelada à arquitetura de uma certa CPU, à arquitetura de uma certa CPU, ou seja, ela depende ou seja, ela depende completamente do hardwarecompletamente do hardware

Por essa razão Assembly não é Por essa razão Assembly não é uma linguagem portável, ao uma linguagem portável, ao contrário da maioria das contrário da maioria das linguagens de alto nívellinguagens de alto nível

Page 4: ASSEMBLY

Assembly - HistóriaAssembly - História

As primeiras linguagens Assembly As primeiras linguagens Assembly surgiram na década de 50, na surgiram na década de 50, na chamada segunda geração das chamada segunda geração das linguagens de programaçãolinguagens de programação

A segunda geração visou libertar os A segunda geração visou libertar os programadores de dificuldades como programadores de dificuldades como lembrar códigos numéricos e calcular lembrar códigos numéricos e calcular endereçosendereços

Page 5: ASSEMBLY

Assembly - HistóriaAssembly - História

Assembly foi muito usada para Assembly foi muito usada para várias aplicações até os anos 80, várias aplicações até os anos 80, quando foi substituída pelas quando foi substituída pelas linguagens de alto nívellinguagens de alto nível

Isso aconteceu principalmente Isso aconteceu principalmente pela necessidade de aumento da pela necessidade de aumento da produtividade de softwareprodutividade de software

Page 6: ASSEMBLY

Assembly - HistóriaAssembly - História

Atualmente Assembly é usada para Atualmente Assembly é usada para manipulação direta de hardware e manipulação direta de hardware e para sistemas que necessitem de para sistemas que necessitem de performance críticaperformance crítica

Device drivers, sistemas embarcados Device drivers, sistemas embarcados de baixo nível e sistemas de tempo de baixo nível e sistemas de tempo real são exemplos de aplicações que real são exemplos de aplicações que usam Assemblyusam Assembly

Page 7: ASSEMBLY

Assembly - AssemblerAssembly - Assembler

A linguagem Assembly é de baixo A linguagem Assembly é de baixo nível, porém ainda precisa ser nível, porém ainda precisa ser transformada na linguagem que a transformada na linguagem que a máquina entendemáquina entende

Quem faz isso é o Assembler. O Quem faz isso é o Assembler. O Assembler é um utilitário que Assembler é um utilitário que traduz o código Assembly para a traduz o código Assembly para a máquinamáquina

Page 8: ASSEMBLY

Assembly - AssemblerAssembly - Assembler

Exemplo:Exemplo:

Antes -> mov al, 061h (Antes -> mov al, 061h (x86x86//IA-32IA-32))

Depois -> 10110000 01100001Depois -> 10110000 01100001

Page 9: ASSEMBLY

Assembly - Assembly - FundamentosFundamentos Byte, Word e Dword são blocos de Byte, Word e Dword são blocos de

dados básicos. O processador dados básicos. O processador trabalha com o tamanho de trabalha com o tamanho de dados adequados para executar dados adequados para executar as instruçõesas instruções

Um byte possui 8 bits, um word Um byte possui 8 bits, um word possui 16 bits ou 2 bytes e um possui 16 bits ou 2 bytes e um dword possui 32 bits ou 4 bytesdword possui 32 bits ou 4 bytes

Page 10: ASSEMBLY

Assembly - Assembly - FundamentosFundamentos Em Assembly é comum representar os Em Assembly é comum representar os

números na forma hexadecimal. Isso números na forma hexadecimal. Isso acontece porque é interessante acontece porque é interessante visualizar o número na forma de dadosvisualizar o número na forma de dados

A representação hexadecimal facilita o A representação hexadecimal facilita o tratamento de números muito grandes tratamento de números muito grandes e permite saber quais bits estão e permite saber quais bits estão “ligados” ou “desligados”“ligados” ou “desligados”

Page 11: ASSEMBLY

Assembly - Assembly - FundamentosFundamentos Um algarismo hexadecimal pode Um algarismo hexadecimal pode

ser representado por quatro ser representado por quatro algarismos bináriosalgarismos binários

Logo um byte pode ser Logo um byte pode ser representado como dois números representado como dois números hexa, um word como quatro hexa, um word como quatro números hexa e um dword como números hexa e um dword como oito números hexaoito números hexa

Page 12: ASSEMBLY

Assembly - Assembly - FundamentosFundamentos

BinárioBinário HexaHexa DecimalDecimal TipoTipo

1000000010000000 80 80 128 128 bytebyte

100000000001000000000000001 00001

8001 8001 32.769 32.769 word word

111111111111111111111111111 11111 FFFF FFFF 65.535 65.535 word word

111111111111111111111111111111111111111111111111111111 1111111111

FFFFFFFF FFFFFFFF 4.294.964.294.967.295 7.295

dword dword

Page 13: ASSEMBLY

Assembly - Assembly - RegistradoresRegistradores Registradores são áreas especiais Registradores são áreas especiais

dentro do processador que são dentro do processador que são mais rápidas que operandos de mais rápidas que operandos de memória.memória.

Como vamos trabalhar com o Como vamos trabalhar com o processador Intel, existem apenas processador Intel, existem apenas 8 registradores de uso geral 8 registradores de uso geral

Page 14: ASSEMBLY

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 devem ser usados preferencialmente para trabalhar preferencialmente para trabalhar com a pilhacom a pilha

Page 15: ASSEMBLY

Assembly - Assembly - RegistradoresRegistradores Nos registradores de uso geral (Exceto Nos registradores de uso geral (Exceto

ESI e EDI) é permitido usar três modos ESI e EDI) é permitido usar três modos de acesso diferentes, ilustrados pela de acesso diferentes, ilustrados pela figura abaixo:figura abaixo:

Page 16: ASSEMBLY

Assembly - Assembly - RegistradoresRegistradores EAX -> Chamado de EAX -> Chamado de

“Acumulador”, geralmente é “Acumulador”, geralmente é usado para operações aritméticas usado para operações aritméticas e para guardar resultadose para guardar resultados

EBX -> Chamado de “Base”, EBX -> Chamado de “Base”, geralmente é usado para geralmente é usado para armazenar dados em geral e para armazenar dados em geral e para endereços de memóriaendereços de memória

Page 17: ASSEMBLY

Assembly - Assembly - RegistradoresRegistradores ECX -> Chamado de “Contador”, ECX -> Chamado de “Contador”,

como o nome já diz é usado como como o nome já diz é usado como contador, principalmente para contador, principalmente para controlar loopscontrolar loops

EDX -> Chamado de registrador EDX -> Chamado de registrador de dados, é usado geralmente de dados, é usado geralmente para guardar o endereço de uma para guardar o endereço de uma variável na memóriavariável na memória

Page 18: ASSEMBLY

Assembly - Assembly - RegistradoresRegistradores ESI e EDI -> Respectivamente “Source ESI e EDI -> Respectivamente “Source

Index” e “Destination Index”, são Index” e “Destination Index”, são menos usados do que os registradores menos usados do que os registradores descritos anteriormente. Geralmente descritos anteriormente. Geralmente usa-se ESI e EDI para movimentação de usa-se ESI e EDI para movimentação de dados, com ESI guardando o endereço dados, com ESI guardando o endereço fonte de uma variável e EDI guardando fonte de uma variável e EDI guardando o endereço destino. Não podem ser o endereço destino. Não podem ser acessados em nível de Byte.acessados em nível de Byte.

Page 19: ASSEMBLY

Assembly - Assembly - RegistradoresRegistradores ESP e EBP -> Respectivamente ESP e EBP -> Respectivamente

“Stack Pointer” e “Base Pointer”, “Stack Pointer” e “Base Pointer”, só devem ser usados para só devem ser usados para manipulação da pilha. O manipulação da pilha. O Registrador ESP guarda a Registrador ESP guarda a referência para o topo da pilha, referência para o topo da pilha, enquanto o registrador EBP é enquanto o registrador EBP é usado para “andar” pela pilhausado para “andar” pela pilha

Page 20: ASSEMBLY

Assembly - Assembly - RegistradoresRegistradores Entre os registradores que não são de Entre os registradores que não são de

uso geral, existe um registrador muito uso geral, existe um registrador muito relevante para o programador, o relevante para o programador, o registrador flagsregistrador flags

Através do registrador flags podemos Através do registrador flags podemos saber se dois valores são iguais, se um saber se dois valores são iguais, se um é maior que outro ou se um valor é é maior que outro ou se um valor é negativo, além de outras informações negativo, além de outras informações

Page 21: ASSEMBLY

Assembly - Assembly - RegistradoresRegistradores

O => OverflowO => Overflow D => DirectionD => Direction I => Interrupt EnableI => Interrupt Enable T => TrapT => Trap S => SignalS => Signal

Page 22: ASSEMBLY

Assembly - Assembly - RegistradoresRegistradores

Z => ZeroZ => Zero A => Auxiliar CarryA => Auxiliar Carry P => ParityP => Parity C => CarryC => Carry

Page 23: ASSEMBLY

Assembly - PilhaAssembly - Pilha

Todos os programas fazem uso da Todos os programas fazem uso da pilha em tempo de execução, porém pilha em tempo de execução, porém nas linguagens de alto nível não é nas linguagens de alto nível não é preciso se preocupar com o preciso se preocupar com o funcionamento da pilha funcionamento da pilha

Já em Assembly, o programador Já em Assembly, o programador precisa saber trabalhar com a pilha, precisa saber trabalhar com a pilha, pois ela é uma ferramenta importantepois ela é uma ferramenta importante

Page 24: ASSEMBLY

Assembly - PilhaAssembly - Pilha

A pilha é uma área de dados A pilha é uma área de dados existente na memória em tempo existente na memória em tempo de execução, na qual seu de execução, na qual seu programa pode armazenar dados programa pode armazenar dados temporariamente temporariamente

O processador é rápido no acesso O processador é rápido no acesso à pilha, tanto para escrever à pilha, tanto para escrever quanto para ler quanto para ler

Page 25: ASSEMBLY

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ções funçõ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

Page 26: ASSEMBLY

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, é Obs: Nas instruções AT&T, é necessário informar o tamanho do necessário informar o tamanho do dado com que se está trabalhandodado com que se está trabalhando

Page 27: ASSEMBLY

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

Page 28: ASSEMBLY

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),%eax Exemplo: addl (%ebx,%ecx),%eax

Page 29: ASSEMBLY

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,ebx Exemplo: sub eax,ebx

- sub fonte, destino (Sintaxe AT&T)- sub fonte, destino (Sintaxe AT&T)

Exemplo: subl %ebx,%eaxExemplo: subl %ebx,%eax

Page 30: ASSEMBLY

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 - and/or/xor fonte, destino (Sintaxe AT&T)AT&T)

Exemplo: andw %bx,%axExemplo: andw %bx,%ax

Page 31: ASSEMBLY

Assembly - IntruçõesAssembly - Intruções

Instrução de comparação:Instrução de comparação:

- cmp operando1, operando2 - cmp operando1, operando2 (Sintaxe Intel)(Sintaxe Intel)

Exemplo: cmp 08h, eaxExemplo: cmp 08h, eax- cmp operando1, operando2 - cmp operando1, operando2

(Sintaxe AT&T)(Sintaxe AT&T)Exemplo: cmp $0x8, %eax Exemplo: cmp $0x8, %eax

Page 32: ASSEMBLY

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)

Page 33: ASSEMBLY

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)

Page 34: ASSEMBLY

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)

Page 35: ASSEMBLY

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 - section .data -> A seção .data é usada para declarar variáveis inicializadas. para declarar variáveis inicializadas. Porém essas “variáveis” não mudam no Porém essas “variáveis” não mudam no decorrer do programa. Essa seção é decorrer do programa. Essa seção é usada geralmente para definir nomes de usada geralmente para definir nomes de arquivos, constantes, entre outros. arquivos, constantes, entre outros.

Page 36: ASSEMBLY

Assembly - SeçõesAssembly - Seções

- Exemplo:- Exemplo:

section .data section .data

mensagem: db 'Hello world!' mensagem: db 'Hello world!'

msglength: equ 12 msglength: equ 12

Page 37: ASSEMBLY

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 .bss section .bss

nomearq: resb 230 ;Reserva 230 nomearq: resb 230 ;Reserva 230 bytesbytes

numero: resb 1 ;Reserva 1 byte numero: resb 1 ;Reserva 1 byte

array: resw 10 ;Reserva 10 words array: resw 10 ;Reserva 10 words

Page 38: ASSEMBLY

Assembly - SeçõesAssembly - Seções

- section .text -> Essa é a seção onde o código - section .text -> Essa é a seção onde o código do programa é escritodo programa é escrito

- Exemplo:- Exemplo:section .text section .text

global _start global _start

_start:_start: . . . .. . . . . .. . . . . .. .

Page 39: ASSEMBLY

Assembly – Assembly – InterrupçõesInterrupções Interrupções são chamadas ao Interrupções são chamadas ao

processador requisitando um processador requisitando um serviçoserviço

O nome interrupção vem do fato de O nome interrupção vem do fato de que o processador tem sua que o processador tem sua atividade atual interrompida quando atividade atual interrompida quando recebe um sinal de chamadarecebe um sinal de chamada

Page 40: ASSEMBLY

Assembly - Assembly - InterrupçõesInterrupções Quando isso acontece, o processador Quando isso acontece, o processador

salva o processo atual e executa a salva o processo atual e executa a rotina daquela interrupção rotina daquela interrupção

Após a execução da rotina, que Após a execução da rotina, que geralmente está armazenada em uma geralmente está armazenada em uma tabela na memória RAM, o tabela na memória RAM, o processador retorna ao processo em processador retorna ao processo em que estava anteriormenteque estava anteriormente

Page 41: ASSEMBLY

Assembly - Assembly - InterrupçõesInterrupções Para se chamar uma interrupção no Para se chamar uma interrupção no

Linux, é feito o seguinte processo:Linux, é feito o seguinte processo:- Coloca-se o número da interrupção - Coloca-se o número da interrupção no registrador EAX no registrador EAX - Coloca-se os argumentos requeridos - Coloca-se os argumentos requeridos pela interrupção nos devidos pela interrupção nos devidos registradores registradores - Chama-se a interrupção - Chama-se a interrupção

O resultado geralmente será retornado O resultado geralmente será retornado em EAX em EAX

Page 42: ASSEMBLY

Assembly - Assembly - InterrupçõesInterrupções- Exemplo (Sintaxe Intel):- Exemplo (Sintaxe Intel):

mov eax,1 ; Interrupção Exit mov eax,1 ; Interrupção Exit mov ebx,0 ; Argumento em EBXmov ebx,0 ; Argumento em EBXint 80h ; Chamada da interrupção int 80h ; Chamada da interrupção

- Exemplo (Sintaxe AT&T):- Exemplo (Sintaxe AT&T):movl $1,%eaxmovl $1,%eaxmovl $0, %ebxmovl $0, %ebxint $0x80int $0x80

Page 43: ASSEMBLY

Assembly - ExemploAssembly - Exemplo

Hello World (Sintaxe Intel)Hello World (Sintaxe Intel)

section .data section .data hello: db 'Hello world!',10 ; A string 'Hello World!‘ e um linefeed hello: 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 .text section .text global _start global _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 escritamov ecx,hello ; Argumento que indica o endereço da string mov ecx,hello ; Argumento que indica o endereço da string mov edx,helloLenght ; Argumento que indica o tamanho da string mov edx,helloLenght ; Argumento que indica o tamanho da string int 80h ; Chamada da interrupção int 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çãoint 80h ; Chamada da interrupção int 80h ; Chamada da interrupção

Page 44: ASSEMBLY

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,%eax mov $4,%eax mov $1,%ebx mov $1,%ebx mov $hello,%ecx mov $hello,%ecx mov $13,%edx mov $13,%edx int $0x80 int $0x80 mov $1,%eax mov $1,%eax mov $0,%ebx mov $0,%ebx int $0x80int $0x80

Page 45: ASSEMBLY

Assembly – Assembly – ReferênciasReferências

www.cin.ufpe.br/~lab3www.cin.ufpe.br/~lab3

No meu public estarei atualizando No meu public estarei atualizando o arquivo “Links-if677.txt” o arquivo “Links-if677.txt” sempre que encontrar referências sempre que encontrar referências interessantesinteressantes