ASSEMBLY
Lucas Aranha
lab3@cin.ufpe.br
Assembly
Assembly uma linguagem de
baixo nvel, chamada
freqentemente de linguagem de
montagem
uma linguagem considerada
difcil, principalmente porque o
programador precisa conhecer a
estrutura da mquina para us-la
Assembly
A linguagem Assembly atrelada
arquitetura de uma certa CPU, ou
seja, ela depende completamente
do hardware
Por essa razo Assembly no uma
linguagem portvel, ao contrrio da
maioria das linguagens de alto
nvel
Assembly - Histria
As primeiras linguagens Assembly
surgiram na dcada de 50, na
chamada segunda gerao das
linguagens de programao
A segunda gerao visou libertar os
programadores de dificuldades como
lembrar cdigos numricos e calcular
endereos
Assembly - Histria
Assembly foi muito usada para
vrias aplicaes at os anos 80,
quando foi substituda pelas
linguagens de alto nvel
Isso aconteceu principalmente
pela necessidade de aumento da
produtividade de software
Assembly - Histria
Atualmente Assembly usada para
manipulao direta de hardware e para
sistemas que necessitem de
performance crtica
Device drivers, sistemas embarcados
de baixo nvel e sistemas de tempo
real so exemplos de aplicaes que
usam Assembly
Assembly - Assembler
A linguagem Assembly de baixo
nvel, porm ainda precisa ser
transformada na linguagem que a
mquina entende
Quem faz isso o Assembler. O
Assembler um utilitrio que
traduz o cdigo Assembly para a
mquina
Assembly - Assembler
Exemplo:
Antes -> mov al, 061h (x86/IA-32)
Depois -> 10110000 01100001
Assembly Fundamentos
Byte, Word e Dword so blocos de
dados bsicos. O processador
trabalha com o tamanho de dados
adequados para executar as
instrues
Um byte possui 8 bits, um word
possui 16 bits ou 2 bytes e um
dword possui 32 bits ou 4 bytes
Assembly Fundamentos
Em Assembly comum representar os
nmeros na forma hexadecimal. Isso
acontece porque interessante
visualizar o nmero na forma de dados
A representao hexadecimal facilita o
tratamento de nmeros muito grandes
e permite saber quais bits esto
ligados ou desligados
Assembly Fundamentos
Um algarismo hexadecimal pode
ser representado por quatro
algarismos binrios
Logo um byte pode ser
representado como dois nmeros
hexa, um word como quatro
nmeros hexa e um dword como
oito nmeros hexa
Assembly Fundamentos
Binrio
Hexa
Decimal
Tipo
10000000
80
128
byte
8001
32.769
word
11111111111
11111
FFFF
65.535
word
11111111111
11111111111
1111111111
FFFFFFFF 4.294.96 dword
7.295
10000000000
00001
Assembly Registradores
Registradores so reas especiais
dentro do processador que so
mais rpidas que operandos de
memria.
Como vamos trabalhar com o
processador Intel, existem apenas
8 registradores de uso geral
Assembly Registradores
So eles:
EAX, EBX, ECX, EDX, ESI, EDI, ESP,
EBP
Os registradores ESP e EBP s
devem ser usados
preferencialmente para trabalhar
com a pilha
Assembly Registradores
Nos registradores de uso geral (Exceto
ESI e EDI) permitido usar trs modos
de acesso diferentes, ilustrados pela
figura abaixo:
Assembly Registradores
EAX -> Chamado de Acumulador,
geralmente usado para
operaes aritmticas e para
guardar resultados
EBX -> Chamado de Base,
geralmente usado para
armazenar dados em geral e para
endereos de memria
Assembly 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 endereo de uma
varivel na memria
Assembly Registradores
ESI e EDI -> Respectivamente Source
Index e Destination Index, so menos
usados do que os registradores
descritos anteriormente. Geralmente
usa-se ESI e EDI para movimentao de
dados, com ESI guardando o endereo
fonte de uma varivel e EDI guardando
o endereo destino. No podem ser
acessados em nvel de Byte.
Assembly Registradores
ESP e EBP -> Respectivamente
Stack Pointer e Base Pointer,
s devem ser usados para
manipulao da pilha. O
Registrador ESP guarda a
referncia para o topo da pilha,
enquanto o registrador EBP
usado para andar pela pilha
Assembly Registradores
Entre os registradores que no so de
uso geral, existe um registrador muito
relevante para o programador, o
registrador flags
Atravs do registrador flags podemos
saber se dois valores so iguais, se um
maior que outro ou se um valor
negativo, alm de outras informaes
Assembly Registradores
O => Overflow
D => Direction
I => Interrupt Enable
T => Trap
S => Signal
Assembly Registradores
Z => Zero
A => Auxiliar Carry
P => Parity
C => Carry
Assembly - Pilha
Todos os programas fazem uso da pilha
em tempo de execuo, porm nas
linguagens de alto nvel no preciso
se preocupar com o funcionamento da
pilha
J em Assembly, o programador
precisa saber trabalhar com a pilha,
pois ela uma ferramenta importante
Assembly - Pilha
A pilha uma rea de dados
existente na memria em tempo de
execuo, na qual seu programa
pode armazenar dados
temporariamente
O processador rpido no acesso
pilha, tanto para escrever quanto
para ler
Assembly - Pilha
As principais funcionalidades da pilha
so:
- Preservar valores de registradores em
funes
- Preservar dados da memria
- Transferir dados sem usar registradores
- Reverter a ordem de dados
- Chamar outras funes e depois retornar
- Passar parmetros para funes
Assembly - Instrues
Movimentao de dados:
- mov destino, fonte (Sintaxe Intel)
- mov fonte, destino (Sintaxe AT&T)
Obs: Nas instrues AT&T, necessrio
informar o tamanho do dado com que
se est trabalhando
Assembly - Instrues
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 - Instrues
Instruo de soma:
- add destino, fonte (Sintaxe Intel)
Exemplo: add eax,[ebx+ecx]
- add fonte, destino (Sintaxe AT&T)
Exemplo: addl (%ebx,%ecx),%eax
Assembly - Instrues
Instruo de subtrao:
- sub destino, fonte (Sintaxe Intel)
Exemplo: sub eax,ebx
- sub fonte, destino (Sintaxe AT&T)
Exemplo: subl %ebx,%eax
Assembly - Instrues
Instrues de operaes lgicas:
- and/or/xor destino, fonte (Sintaxe Intel)
Exemplo: and ax,bx
- and/or/xor fonte, destino (Sintaxe
AT&T)
Exemplo: andw %bx,%ax
Assembly - Intrues
Instruo de comparao:
- cmp operando1, operando2
(Sintaxe Intel)
Exemplo: cmp 08h, eax
- cmp operando1, operando2
(Sintaxe AT&T)
Exemplo: cmp $0x8, %eax
Assembly - Instrues
Instrues de jump:
Pulo incondicional:
- jmp [100] (Sintaxe Intel)
- jmp eax (Sintaxe Intel)
- jmp *100 (Sintaxe AT&T)
- jmp *%eax (Sintaxe AT&T)
Assembly - Instrues
Pulo condicional:
- je [100] (Sintaxe Intel)
- jne eax (Sintaxe Intel)
- je *100 (Sintaxe AT&T)
- jne *%eax (Sintaxe AT&T)
Assembly - Instrues
Instrues de manipulao da pilha:
- push eax (Sintaxe Intel)
- push %eax (Sintaxe AT&T)
- pop eax (Sintaxe Intel)
- pop %eax (Sintaxe AT&T)
Assembly - Sees
O cdigo Assembly dividido em sees.
As principais sees no Linux so:
- section .data -> A seo .data usada
para declarar variveis inicializadas.
Porm essas variveis no mudam no
decorrer do programa. Essa seo
usada geralmente para definir nomes de
arquivos, constantes, entre outros.
Assembly - Sees
- Exemplo:
section .data
mensagem: db 'Hello world!'
msglength: equ 12
Assembly - Sees
- section .bss -> a seo usada para
declarar as variveis do programa
- Exemplo:
section .bss
nomearq: resb 230 ;Reserva 230 bytes
numero: resb 1 ;Reserva 1 byte
array: resw 10 ;Reserva 10 words
Assembly - Sees
- section .text -> Essa a seo onde o cdigo
do programa escrito
- Exemplo:
section .text
global _start
_start:
.
.
.
.
.
.
.
.
.
Assembly
Interrupes
Interrupes so chamadas ao
processador requisitando um servio
O nome interrupo vem do fato de
que o processador tem sua
atividade atual interrompida quando
recebe um sinal de chamada
Assembly Interrupes
Quando isso acontece, o processador
salva o processo atual e executa a
rotina daquela interrupo
Aps a execuo da rotina, que
geralmente est armazenada em uma
tabela na memria RAM, o processador
retorna ao processo em que estava
anteriormente
Assembly Interrupes
Para se chamar uma interrupo no
Linux, feito o seguinte processo:
- Coloca-se o nmero da interrupo no
registrador EAX
- Coloca-se os argumentos requeridos
pela interrupo nos devidos
registradores
- Chama-se a interrupo
O resultado geralmente ser retornado
em EAX
Assembly Interrupes
- Exemplo (Sintaxe Intel):
mov eax,1 ; Interrupo Exit
mov ebx,0 ; Argumento em EBX
int 80h ; Chamada da interrupo
- Exemplo (Sintaxe AT&T):
movl $1,%eax
movl $0, %ebx
int $0x80
Assembly - 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 ; Interrupo de escrita (sys_write)
mov ebx,1 ; Argumento que indica onde a string vai ser escrita
mov ecx,hello ; Argumento que indica o endereo da string
mov edx,helloLenght ; Argumento que indica o tamanho da string
int 80h ; Chamada da interrupo
mov eax,1 ; Interrupo exit (sys_exit)
mov ebx,0 ; Argumento da interrupo
int 80h ; Chamada da interrupo
Assembly - 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
Assembly
Referncias
www.cin.ufpe.br/~lab3
No meu public estarei atualizando
o arquivo Links-if677.txt sempre
que encontrar referncias
interessantes