Você está na página 1de 53

ASSEMBLY

Ciro Ceissler
clac@cin.ufpe.br / ciro.ceissler@gmail.com

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

linguagem Assembly atrelada


arquitetura de uma certa CPU, ou seja, ela
depende completamente do hardware

Cada

famlia de processador tem sua


prpria linguagem assembly (Ex. X86,
ARM, SPARC, MIPS)

Por

essa razo Assembly no uma


linguagem portvel, ao contrrio da
maioria das linguagens de alto nvel

Assembly

Antes

do assembly:

adio do microprocessador de sinal digital


(DSP) TMS-320C54x da Texas Instruments
0000000SIAAAAAAA

instruo de adio dos computadores B-200,


B-300 e B-500 da Burroughs Corporation:
Campo: O M N AAA BBB CCC
Cdigo: 1 2 3 100 200 300

Assembly

As

primeiras linguagens Assembly


surgiram na dcada de 50, na chamada
segunda gerao das linguagens de
programao

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

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

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

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

111111111111
1111

FFFF

65.535

word

111111111111
111111111111
11111111

FFFFFFFF

4.294.967 dword
.295

100000000000
0001

Assembly - Fundamentos

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

Assembly - Registradores
Nos

registradores de uso geral (Exceto


ESI e EDI) permitido usar trs
modos de acesso diferentes, ilustrados
pela figura abaixo:

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

Assembly - Registradores

O => Overflow
D => Direction
I => Interrupt Enable
T => Trap
S => Signal

Assembly - Registradores

Z
A
P
C

=> Zero
=> Auxiliar Carry
=> Parity
=> Carry

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

em Assembly, o programador precisa


saber trabalhar com a pilha, pois ela
uma ferramenta importante

Assembly - Pilha

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

push
push
push
push
push
push
push
push

ax
bx
cx
dx
ds
es
di
si

pusha
push es, ds
popa
pop es, ds

Assembly Exemplo Pilha

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

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

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

Interrupes

so chamadas ao
processador requisitando um servio

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

Assembly - Interrupes

Um

programa constituido por vrias


regies de memria.

Pilha
Heap
Cdigo
Dados

Assembly Organizao do
Programa

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 modo de 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 - Exemplo

.stack
.data
include arquivo1.asm
include arquivo2.asm
.code
start:
include arquivo3.asm
end start

Assembly - Include

.data
arquivo1
arquivo2
arquivo3
arquivo4
arquivo5
arquivo6
arquivo7
arquivo8

db
db
db
db
db
db
db
db

'dat/arquivo1'
'dat/arquivo2'
'dat/arquivo3'
'dat/arquivo4'
'dat/arquivo5'
'dat/arquivo6'
'dat/arquivo7'
'dat/arquivo8'

,
,
,
,
,
,
,
,

0
0
0
0
0
0
0
0

Assembly Carregar Arquivos

.text
call NomeProcedimento
NomeProcedimento PROC NEAR
mov ax, 0x0F;
ret
NomeProcedimento ENDP

Assembly - Procedimentos

Exemplo

mov ah, 0
mov al, 13h
int 10h
Video

; modo video 320*200

Display Area (RAM)

A000 -> grficos de alta resoluo


B000
B800

Assembly Interrupo de Vdeo

www.cin.ufpe.br/~clac/infra_de_software
http://www.wagemakers.be/english/doc/vga
http://www.scribd.com/doc/13290971/INTERRUPCOES
http://maven.smith.edu/~thiebaut/ArtOfAssembly/artofasm.html
http://www.xs4all.nl/~smit/asm04001.htm#vga
http://arapaho.nsuok.edu/~kingw/CS3173/Chapter9.htm
http://burks.bton.ac.uk/burks/language/asm/asmtut/asm8.htm

Assembly Referncias