Assembly-Aula 1 Final

47
ASSEMBLY ASSEMBLY Ciro Ceissler [email protected] / [email protected]

description

fdfsdfsdf

Transcript of Assembly-Aula 1 Final

Page 1: Assembly-Aula 1 Final

ASSEMBLYASSEMBLYCiro Ceissler

[email protected] / [email protected]

Page 2: Assembly-Aula 1 Final

AssemblyAssembly

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

Page 3: Assembly-Aula 1 Final

AssemblyAssembly

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

Cada família de processador tem sua própria linguagem assembly (Ex. X86, ARM, SPARC, MIPS)

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

Page 4: Assembly-Aula 1 Final

AssemblyAssembly

Antes do assembly:

◦adição do microprocessador de sinal digital (DSP) TMS-320C54x da Texas Instruments 0000000SIAAAAAAA

◦instrução de adição dos computadores B-200, B-300 e B-500 da Burroughs Corporation: Campo: O M N AAA BBB CCC Código: 1 2 3 100 200 300

Page 5: Assembly-Aula 1 Final

Assembly - HistóriaAssembly - História

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

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

Page 6: Assembly-Aula 1 Final

Assembly - HistóriaAssembly - História

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

Isso aconteceu principalmente pela necessidade de aumento da produtividade de software

Page 7: Assembly-Aula 1 Final

Assembly - HistóriaAssembly - História

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

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

Page 8: Assembly-Aula 1 Final

Assembly - AssemblerAssembly - Assembler

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

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

Page 9: Assembly-Aula 1 Final

Assembly - AssemblerAssembly - Assembler

Exemplo:

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

Depois -> 10110000 01100001

Page 10: Assembly-Aula 1 Final

Assembly - FundamentosAssembly - Fundamentos

Byte, Word e Dword são blocos de dados básicos. O processador trabalha com o tamanho de dados adequados para executar as instruções

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

Page 11: Assembly-Aula 1 Final

Assembly - FundamentosAssembly - Fundamentos

Em Assembly é comum representar os números na forma hexadecimal. Isso acontece porque é interessante visualizar o número na forma de dados

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

Page 12: Assembly-Aula 1 Final

Assembly - FundamentosAssembly - Fundamentos

Um algarismo hexadecimal pode ser representado por quatro algarismos binários

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

Page 13: Assembly-Aula 1 Final

Assembly - FundamentosAssembly - Fundamentos

BinárioBinário HexaHexa DecimalDecimal TipoTipo

1000000010000000 80 80 128 128 bytebyte

1000000000001000000000000001 0001

8001 8001 32.769 32.769 word word

1111111111111111111111111111 1111 FFFF FFFF 65.535 65.535 word word

11111111111111111111111111111111111111111111111111111111 11111111

FFFFFFFF FFFFFFFF 4.294.9674.294.967.295 .295

dword dword

Page 14: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

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

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

Page 15: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

São eles:EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP

Os registradores ESP e EBP só devem ser usados preferencialmente para trabalhar com a pilha

Page 16: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

Nos registradores de uso geral (Exceto ESI e EDI) é permitido usar três modos de acesso diferentes, ilustrados pela figura abaixo:

Page 17: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

EAX -> Chamado de “Acumulador”, geralmente é usado para operações aritméticas e para guardar resultados

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

Page 18: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

ECX -> Chamado de “Contador”, como o nome já diz é usado como contador, principalmente para controlar loops

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

Page 19: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

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

Page 20: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

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

Page 21: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

Entre os registradores que não são de uso geral, existe um registrador muito relevante para o programador, o registrador flags

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

Page 22: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

O => OverflowD => DirectionI => Interrupt EnableT => TrapS => Signal

Page 23: Assembly-Aula 1 Final

Assembly - RegistradoresAssembly - Registradores

Z => ZeroA => Auxiliar CarryP => ParityC => Carry

Page 24: Assembly-Aula 1 Final

Assembly - PilhaAssembly - Pilha

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

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

Page 25: Assembly-Aula 1 Final

Assembly - PilhaAssembly - Pilha

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

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

Page 26: Assembly-Aula 1 Final

Assembly - PilhaAssembly - Pilha

As principais funcionalidades da pilha são:

- Preservar valores de registradores em funções

- Preservar dados da memória - Transferir dados sem usar registradores- Reverter a ordem de dados- Chamar outras funções e depois retornar- Passar parâmetros para funções

Page 27: Assembly-Aula 1 Final

Assembly - InstruçõesAssembly - Instruções

Movimentação de dados:

- mov destino, fonte (Sintaxe Intel)

- mov fonte, destino (Sintaxe AT&T)

Obs: Nas instruções AT&T, é necessário informar o tamanho do dado com que se está trabalhando

Page 28: Assembly-Aula 1 Final

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 29: Assembly-Aula 1 Final

Assembly - InstruçõesAssembly - Instruções

Instrução de soma:

- add destino, fonte (Sintaxe Intel)Exemplo: add eax,[ebx+ecx]

- add fonte, destino (Sintaxe AT&T)Exemplo: addl (%ebx,%ecx),%eax

Page 30: Assembly-Aula 1 Final

Assembly - InstruçõesAssembly - Instruções

Instrução de subtração:

- sub destino, fonte (Sintaxe Intel)Exemplo: sub eax,ebx

- sub fonte, destino (Sintaxe AT&T)Exemplo: subl %ebx,%eax

Page 31: Assembly-Aula 1 Final

Assembly - InstruçõesAssembly - Instruções

Instruções de operações lógicas:

- and/or/xor destino, fonte (Sintaxe Intel)Exemplo: and ax,bx

- and/or/xor fonte, destino (Sintaxe AT&T)Exemplo: andw %bx,%ax

Page 32: Assembly-Aula 1 Final

Assembly - InstruçõesAssembly - Instruções

Instrução de comparação:

- cmp operando1, operando2 (Sintaxe Intel)Exemplo: cmp 08h, eax- cmp operando1, operando2 (Sintaxe

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

Page 33: Assembly-Aula 1 Final

Assembly - InstruçõesAssembly - Instruções

Instruções de jump:

“Pulo” incondicional:

- jmp [100] (Sintaxe Intel) - jmp eax (Sintaxe Intel)

- jmp *100 (Sintaxe AT&T)- jmp *%eax (Sintaxe AT&T)

Page 34: Assembly-Aula 1 Final

Assembly - InstruçõesAssembly - Instruções

“Pulo” condicional:

- je [100] (Sintaxe Intel) - jne eax (Sintaxe Intel)

- je *100 (Sintaxe AT&T)- jne *%eax (Sintaxe AT&T)

Page 35: Assembly-Aula 1 Final

Assembly - InstruçõesAssembly - Instruções

Instruções de manipulação da pilha:

- push eax (Sintaxe Intel)- push %eax (Sintaxe AT&T)

- pop eax (Sintaxe Intel)- Pop %eax (Sintaxe AT&T)

Page 36: Assembly-Aula 1 Final

Assembly - SeçõesAssembly - Seções

O código Assembly é dividido em seções. As principais seções no Linux são:

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

Page 37: Assembly-Aula 1 Final

Assembly - SeçõesAssembly - Seções

- Exemplo:

section .data mensagem: db 'Hello world!' msglength: equ 12

Page 38: Assembly-Aula 1 Final

Assembly - SeçõesAssembly - Seções

- section .bss -> É a seção usada para declarar as variáveis do programa

- Exemplo:section .bss

nomearq: resb 230 ;Reserva 230 bytes

numero: resb 1 ;Reserva 1 byte array: resw 10 ;Reserva 10 words

Page 39: Assembly-Aula 1 Final

Assembly - SeçõesAssembly - Seções

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

- Exemplo:section .text

global _start

_start: . . . . . . . . .

Page 40: Assembly-Aula 1 Final

Assembly - InterrupçõesAssembly - Interrupções

Interrupções são chamadas ao processador requisitando um serviço

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

Page 41: Assembly-Aula 1 Final

Assembly - InterrupçõesAssembly - Interrupções

Quando isso acontece, o processador salva o processo atual e executa a rotina daquela interrupção

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

Page 42: Assembly-Aula 1 Final

Assembly - InterrupçõesAssembly - Interrupções

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

O resultado geralmente será retornado em EAX

Page 43: Assembly-Aula 1 Final

Assembly - InterrupçõesAssembly - Interrupções

- Exemplo (Sintaxe Intel):mov eax,1 ; Interrupção Exit mov ebx,0 ; Argumento em EBXint 80h ; Chamada da interrupção

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

Page 44: Assembly-Aula 1 Final

Assembly – Organização do Assembly – Organização do ProgramaPrograma

Um programa é constituido por várias regiões de memória.◦Pilha◦Heap◦Código◦Dados

Page 45: Assembly-Aula 1 Final

Assembly - ExemploAssembly - Exemplo

Hello World (Sintaxe Intel)

section .data hello: db 'Hello world!',10 ; A string 'Hello World!‘ e um linefeed helloLenght: equ $-hello ; Tamanho da string hello

section .text global _start

_start: mov eax,4 ; Interrupção de escrita (sys_write) mov ebx,1 ; Argumento que indica modo de escritamov ecx,hello ; Argumento que indica o endereço da string mov edx,helloLenght ; Argumento que indica o tamanho da string int 80h ; Chamada da interrupção mov eax,1 ; Interrupção exit (sys_exit)mov ebx,0 ; Argumento da interrupçãoint 80h ; Chamada da interrupção

Page 46: Assembly-Aula 1 Final

Assembly - ExemploAssembly - Exemplo

Hello World (Sintaxe AT&T)

.data hello: .string "Hello World!\n"

.text .globl main

main: mov $4,%eax mov $1,%ebx mov $hello,%ecx mov $13,%edx int $0x80 mov $1,%eax mov $0,%ebx int $0x80

Page 47: Assembly-Aula 1 Final

Assembly – ReferênciasAssembly – Referências

www.cin.ufpe.br/~lab3

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