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