Você está na página 1de 53

ASSEMBLY

Cleivson Arruda csa3@cin.ufpe.br / cleivson.tb@gmail.com

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

A linguagem Assembly é atrelada à arquitetura de uma certa CPU, ou seja, ela depende completamente do hardware Cada família de processador tem sua própria linguagem assembly (Ex. X86, ARM, SPARC, MIPS) Por essa razão Assembly não é uma linguagem portável, ao contrário da maioria das linguagens de alto nível

Assembly

Antes do assembly:
◦ adição do microprocessador de sinal digital (DSP) TMS-320C54x da Texas Instruments
 0000000SIAAAAAAA

◦ instrução de adição dos computadores B-200, B-300 e B-500 da Burroughs Corporation:
 Campo: O M N AAA BBB CCC  Código: 1 2 3 100 200 300

Assembly

As primeiras linguagens Assembly surgiram na década de 50, na chamada segunda geração das linguagens de programação A segunda geração visou libertar os programadores de dificuldades como lembrar códigos numéricos e calcular endereços

Assembly - História

História . quando foi substituída pelas linguagens de alto nível Isso aconteceu principalmente pela necessidade de aumento da produtividade de software  Assembly . Assembly foi muito usada para várias aplicações até os anos 80.

 Atualmente Assembly é usada para manipulação direta de hardware e para sistemas que necessitem de performance crítica Device drivers.História . sistemas embarcados de baixo nível e sistemas de tempo real são exemplos de aplicações que usam Assembly  Assembly .

Assembler . A linguagem Assembly é de baixo nível. O Assembler é um utilitário que traduz o código Assembly para a máquina  Assembly . porém ainda precisa ser transformada na linguagem que a máquina entende Quem faz isso é o Assembler.

Assembler . 061h (x86/IA-32) Depois -> 10110000 01100001 Assembly . Exemplo: Antes -> mov al.

Fundamentos . Word e Dword são blocos de dados básicos. um word possui 16 bits ou 2 bytes e um dword possui 32 bits ou 4 bytes Assembly . O processador trabalha com o tamanho de dados adequados para executar as instruções  Um byte possui 8 bits. Byte.

Isso acontece porque é interessante visualizar o número na forma de dados A representação hexadecimal facilita o tratamento de números muito grandes e permite saber quais bits estão “ligados” ou “desligados”  Assembly . Em Assembly é comum representar os números na forma hexadecimal.Fundamentos .

 Um algarismo hexadecimal pode ser representado por quatro algarismos binários Logo um byte pode ser representado como dois números hexa. um word como quatro números hexa e um dword como oito números hexa  Assembly .Fundamentos .

Fundamentos .294.535 Tipo byte word word 4.Binário 10000000 10000000000000 01 11111111111111 11 11111111111111 11111111111111 1111 Hexa 80 8001 FFFF FFFFFFFF Decimal 128 32.769 65.2 dword 95 Assembly .967.

existem apenas 8 registradores de uso geral  Assembly . Como vamos trabalhar com o processador Intel.Registradores . Registradores são áreas especiais dentro do processador que são mais rápidas que operandos de memória.

EDX. EDI.São eles: EAX. ESI. ESP. ECX. EBP   Os registradores ESP e EBP só devem ser usados preferencialmente para trabalhar com a pilha Assembly .Registradores . EBX.

Registradores  Nos registradores de uso geral (Exceto ESI e EDI) é permitido usar três modos de acesso diferentes.Assembly . ilustrados pela figura abaixo: .

Registradores . geralmente é usado para operações aritméticas e para guardar resultados EBX -> Chamado de “Base”. EAX -> Chamado de “Acumulador”. geralmente é usado para armazenar dados em geral e para endereços de memória  Assembly .

 ECX -> Chamado de “Contador”. como o nome já diz é usado como contador.Registradores . é usado geralmente para guardar o endereço de uma variável na memória  Assembly . principalmente para controlar loops EDX -> Chamado de registrador de dados.

Assembly . Não podem ser acessados em nível de Byte. Geralmente usa-se ESI e EDI para movimentação de dados.Registradores . com ESI guardando o endereço fonte de uma variável e EDI guardando o endereço destino. são menos usados do que os registradores descritos anteriormente. ESI e EDI -> Respectivamente “Source Index” e “Destination Index”.

 ESP e EBP -> Respectivamente “Stack Pointer” e “Base Pointer”.Registradores . só devem ser usados para manipulação da pilha. O Registrador ESP guarda a referência para o topo da pilha. enquanto o registrador EBP é usado para “andar” pela pilha Assembly .

 Entre os registradores que não são de uso geral.Registradores . o registrador flags Através do registrador flags podemos saber se dois valores são iguais. se um é maior que outro ou se um valor é negativo. além de outras informações  Assembly . existe um registrador muito relevante para o programador.

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 . porém nas linguagens de alto nível não é preciso se preocupar com o funcionamento da pilha Já em Assembly. pois ela é uma ferramenta importante  Assembly . o programador precisa saber trabalhar com a pilha. Todos os programas fazem uso da pilha em tempo de execução.

Pilha . A pilha é uma área de dados existente na memória em tempo de execução. tanto para escrever quanto para ler Assembly . na qual seu programa pode armazenar dados temporariamente  O processador é rápido no acesso à pilha.

Pilha . As principais funcionalidades da pilha são: .Preservar dados da memória .Passar parâmetros para funções Assembly .Reverter a ordem de dados .Preservar valores de registradores em funções .Chamar outras funções e depois retornar .Transferir dados sem usar registradores .

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 .

fonte (Sintaxe Intel) . destino (Sintaxe AT&T)  Obs: Nas instruções AT&T. é necessário informar o tamanho do dado com que se está trabalhando Assembly . Movimentação de dados: .Instruções .mov destino.mov fonte.

%ebx mov eax.Instruções . [ebx+3] movl (%ebx). 1 mov ebx. 0ffh AT&T movl $1. %eax movl $0xff. %eax movl 3(%ebx).Intel mov eax. [ebx] mov eax. %eax Assembly .

 Instrução de soma: .Instruções .%ecx). destino (Sintaxe AT&T) Exemplo: addl (%ebx.add fonte.add destino.%eax Assembly . fonte (Sintaxe Intel) Exemplo: add eax.[ebx+ecx] .

sub fonte.sub destino.Instruções .%eax Assembly . destino (Sintaxe AT&T) Exemplo: subl %ebx. Instrução de subtração: . fonte (Sintaxe Intel) Exemplo: sub eax.ebx .

destino (Sintaxe AT&T) Exemplo: andw %bx.and/or/xor fonte.and/or/xor destino.bx .%ax Assembly . fonte (Sintaxe Intel) Exemplo: and ax. Instruções de operações lógicas: .Instruções .

Instruções . eax . operando2 (Sintaxe Intel) Exemplo: cmp 08h. Instrução de comparação: .cmp operando1. %eax Assembly . operando2 (Sintaxe AT&T) Exemplo: cmp $0x8.cmp operando1.

 Instruções de jump: “Pulo” incondicional: .jmp *%eax (Sintaxe AT&T) Assembly .jmp eax (Sintaxe Intel) .jmp *100 (Sintaxe AT&T) .jmp [100] (Sintaxe Intel) .Instruções .

jne *%eax (Sintaxe AT&T) Assembly .je [100] (Sintaxe Intel) .Instruções .jne eax (Sintaxe Intel) .“Pulo” condicional: .je *100 (Sintaxe AT&T) .

push %eax (Sintaxe AT&T) .pop eax (Sintaxe Intel) .Instruções . Instruções de manipulação da pilha: .push eax (Sintaxe Intel) .Pop %eax (Sintaxe AT&T) Assembly .

section . entre outros.data é usada para declarar variáveis inicializadas. constantes.data -> A seção . Assembly . As principais seções no Linux são: . O código Assembly é dividido em seções.Seções . Essa seção é usada geralmente para definir nomes de arquivos. Porém essas “variáveis” não mudam no decorrer do programa.

Seções ..Exemplo: section .data mensagem: db 'Hello world!' msglength: equ 12 Assembly .

section .bss nomearq: resb 230 .Exemplo: section .Seções .Reserva 10 words Assembly .Reserva 230 bytes numero: resb 1 ..Reserva 1 byte array: resw 10 .bss -> É a seção usada para declarar as variáveis do programa .

.text -> Essa é a seção onde o código do programa é escrito .text global _start _start: . . ..Exemplo: section . . . Assembly .Seções . . . .section .

 Interrupções são chamadas ao processador requisitando um serviço O nome interrupção vem do fato de que o processador tem sua atividade atual interrompida quando recebe um sinal de chamada  Assembly .Interrupções .

 Quando isso acontece. que geralmente está armazenada em uma tabela na memória RAM. o processador retorna ao processo em que estava anteriormente  Assembly .Interrupções . o processador salva o processo atual e executa a rotina daquela interrupção Após a execução da rotina.

Interrupções .Coloca-se os argumentos requeridos pela interrupção nos devidos registradores .Coloca-se o número da interrupção no registrador EAX . é feito o seguinte processo: .Chama-se a interrupção  O resultado geralmente será retornado em EAX  Assembly .Para se chamar uma interrupção no Linux.

Interrupção Exit mov ebx. Chamada da interrupção . %ebx int $0x80 Assembly .Interrupções .1 . Argumento em EBX int 80h .Exemplo (Sintaxe Intel): mov eax.Exemplo (Sintaxe AT&T): movl $1..0 .%eax movl $0.

Assembly .Interrupções .

 Um programa é constituido por várias regiões de memória. ◦ ◦ ◦ ◦ Pilha Heap Código Dados Assembly – Organização do Programa .

Interrupção de escrita (sys_write) mov ebx. Chamada da interrupção Assembly . Argumento que indica o endereço da string mov edx.data hello: db 'Hello world!'.Exemplo .text global _start _start: mov eax.helloLenght .1 .0 . Argumento que indica o tamanho da string int 80h .1 . Hello World (Sintaxe Intel) section . Argumento da interrupção int 80h .hello .10 . Interrupção exit (sys_exit) mov ebx. A string 'Hello World!„ e um linefeed helloLenght: equ $-hello . Tamanho da string hello section . Chamada da interrupção mov eax. Argumento que indica modo de escrita mov ecx.4 .

%eax mov $1. Hello World (Sintaxe AT&T) .data hello: .globl main main: mov $4.text .%edx int $0x80 mov $1.%ecx mov $13.string "Hello World!\n" .Exemplo .%ebx mov $hello.%ebx int $0x80 Assembly .%eax mov $0.

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

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

0x0F.text call NomeProcedimento NomeProcedimento PROC NEAR mov ax.. ret NomeProcedimento ENDP Assembly .Procedimentos .

0 mov al. modo video 320*200 Video Display Area (RAM) ◦ A000 -> gráficos de alta resolução ◦ B000 ◦ B800 Assembly – Interrupção de Vídeo . 13h int 10h   .Exemplo mov ah.

html http://www.cin.com/doc/13290971/INTERRUPCOES http://maven.ac.edu/~kingw/CS3173/Chapter9.wagemakers.edu/~thiebaut/ArtOfAssembly/artof asm.smith.       www.bton.ufpe.ht m http://burks.be/english/doc/vga http://www.nl/~smit/asm04001.htm#vga http://arapaho.uk/burks/language/asm/asmtut/as m8.nsuok.br/~clac/infra_de_software http://www.xs4all.scribd.htm Assembly – Referências .

04 0. 0- 24. 0- 39  8802- 8802- 0254 .O 0447/ $39. 0. 0/ 39   24.04 89730447/3 909 4-2.3 24.9.0% % /.3 2. 24. 24. 0. 24.

79 8802- 8802- 3. 3.4/0 89.82 .79 3.:/0.:/0. 89.4 ..82 03/89.9.82 3. /.4 .:/0.:/0 .4 .76:.76:.76:.

.9.4/- /.76:. /.9.

.4  .4/- /.76:.9.76:.

4  .4/- /.9..76:.76:.

4/- /..76:.4  .9.76:.

4  .76:.4/- /..9.76:.

4/- /.76:.9.76:..4  .

9.76:.4  ..4/- /.76:.

9.76:..76:.4/- /.4  .

48 ..76:.770.776:.4          8802- .

.    709 420!74.0/203948 .0/20394 420!74.0/20394!# # 24. 909 ..420!74.0/20394! 8802- 8802- !74.

O 0254 24..48/0. #    7E1.70.7084:4     O 8802- 39077:54/0'J/04 .  24.9./04  39  '/0485. 24/4..

O O O O O O O  .3 :150 -7.

=..

317.70 995.*/0*8419.

.

078 -0. .02.

038.

/4.

995...

.

7-/ . 8.42.

/4.

 .

%##&! $ 995.

.

.2.03 829 0/:.

=90-.:9.

79 18802-.

82 92 995..7941 .

.

 3. 8.

=829.

995...82   92.

.

7..4 38:4 0/:.5.

=3.

$.

5907 9 2 995..

.

. :.-:78 -943 .

-:78.

3:.0..

82..

.829:9.

..8 2 92 8802- #0107H3.8 .