You are on page 1of 45

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