Professional Documents
Culture Documents
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 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
Assembly
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 - Histria
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 - 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 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
10000000 10000000000000 01 11111111111111 11 11111111111111 11111111111111 1111
4.294.967.2 dword 95
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
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
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
- 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
ax bx cx dx ds es di si
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
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
- 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
- push eax (Sintaxe Intel) - push %eax (Sintaxe AT&T) - pop eax (Sintaxe Intel) - Pop %eax (Sintaxe AT&T)
Assembly - Instrues
- 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
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 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 - Interrupes
Assembly - Interrupes
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
.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
db db db db db db db db
, , , , , , , ,
0 0 0 0 0 0 0 0
.text call NomeProcedimento NomeProcedimento PROC NEAR mov ax, 0x0F; ret NomeProcedimento ENDP
Assembly - Procedimentos
Assembly Referncias