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. 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. 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. 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. 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. 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
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. 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. 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
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. 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. 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. 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. 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. 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. 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. 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. Assembly -Assembly -
RegistradoresRegistradores
O => OverflowO => Overflow
D => DirectionD => Direction
I => Interrupt EnableI => Interrupt Enable
T => TrapT => Trap
S => SignalS => Signal
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. 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. 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. 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
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. 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. 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.
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. 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. 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. 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. 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. 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. 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
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