ASSEMBLY Lucas Aranha [email protected]. Assembly Assembly é uma linguagem de baixo nível, chamada...

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

Transcript of ASSEMBLY Lucas Aranha [email protected]. Assembly Assembly é uma linguagem de baixo nível, chamada...

ASSEMBLYASSEMBLYLucas AranhaLucas Aranha

[email protected]@cin.ufpe.br

AssemblyAssembly Assembly é uma linguagem de Assembly é uma linguagem de

baixo nível, chamada baixo nível, chamada freqüentemente de “linguagem de freqüentemente de “linguagem de montagem”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

AssemblyAssembly A linguagem Assembly é atrelada à A linguagem Assembly é atrelada à

arquitetura de uma certa CPU, ou arquitetura de uma certa CPU, ou seja, ela depende completamente seja, ela depende completamente do hardwaredo 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

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

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

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

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

Assembly - AssemblerAssembly - Assembler Exemplo:Exemplo:

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

Depois -> 10110000 01100001Depois -> 10110000 01100001

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 dados trabalha com o tamanho de dados adequados para executar as adequados para executar as instruçõesinstruçõ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

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”

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

Assembly - Assembly - FundamentosFundamentosBinárioBinário HexaHexa DecimalDecimal TipoTipo1000000010000000 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

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

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

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:

Assembly - Assembly - RegistradoresRegistradores EAX -> Chamado de “Acumulador”, EAX -> Chamado de “Acumulador”,

geralmente é usado para geralmente é usado para operações aritméticas e para operações aritméticas e para guardar resultadosguardar 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

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

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.

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

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

Assembly - Assembly - RegistradoresRegistradores

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

Assembly - Assembly - RegistradoresRegistradores

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

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

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 programa de execução, na qual seu programa pode armazenar dados pode armazenar dados temporariamente temporariamente

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

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

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

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

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

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

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

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

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)

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)

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)

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.

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

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 bytesnomearq: resb 230 ;Reserva 230 bytesnumero: resb 1 ;Reserva 1 byte numero: resb 1 ;Reserva 1 byte array: resw 10 ;Reserva 10 words array: resw 10 ;Reserva 10 words

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: . . . .. . . . . .. . . . . .. .

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

processador requisitando um serviçoprocessador requisitando um serviço

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

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

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 no - Coloca-se o número da interrupção no registrador EAX 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

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

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

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

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