Você está na página 1de 46

x86 Assembly Mini-Course

Part 1

Bruno P. Evangelista bpevangelista@gmail.com

Introduo
Assembly uma linguagem de programao de baixo nvel em formato mnemonico Ela possibilita trabalhar diretamente com o processador da mquina, executando operaes que muitas vezes no so possveis em linguagens de alto nvel

x86 Assembly Course p.1/26

Porque utilizar?
Muito utilizado no desenvolvimento de aplicativos que exigem resposta em tempo real Tirar proveito de conjuntos de instrues especcas dos processadores: SSE, SSE2, SSE3, 3DNOW, outros Obter conhecimento do funcionamento do hardware, visando desenvolver softwares de melhor qualidade

x86 Assembly Course p.2/26

Utilizao em softwares
Muitas vezes os aplicativos precisam de um desempenho maior em partes crticas do cdigo Nesses techos devem ser utilizados algoritmos otimizados, com baixa ordem de complexidade Mesmo com o uso de um algoritmo adequado, pode no ser possvel atingir o tempo de resposta necessrio Nesses casos, podemos tentar melhorar a performance utilizando otimizaes de baixo nvel

x86 Assembly Course p.3/26

Problemas
Otimizaes de baixo nvel no podem ser programadas em linguagens de alto nvel como C/C++ ou Java Quando fazemos otimizaes de baixo nvel, estamos conando mais em ns mesmo, que no compilador para fazer a gerao de cdigo Muitas vezes otimizaes de baixo nvel no so a soluo para gargalos no desempenho, sendo necessrio trocar a ordem de complexidade do algoritmo utilizado

x86 Assembly Course p.4/26

Ferramentas utilizadas
Principais: Editor de cdigo - No existem IDEs com grandes recursos, devido as limitaes da linguagem Montador Utilitrios: Depurador Editor hexadecimal

x86 Assembly Course p.5/26

Montadores
Um dos primos do compilador O papel do montador transformar os mnemonicos em cdigo de mquina Existem vrios montadores para a linguagem Assembly: MASM - Microsoft Assembler NASM - Netwide Assembler (Verses para diferentes plataformas) TASM - Turbo Assembler (Borland)

x86 Assembly Course p.6/26

Depurador
Ferramenta extremamente importante para encontrar erros cometidos durante a programao Erros cometidos durante a programao geralmente travam a mquina, no sendo possvel detecta-lo com facilidade Um erro cometido na 10 linha de cdigo geralmente s percebido centenas de linhas para frente, longe de onde o erro foi cometido

x86 Assembly Course p.7/26

Editor hexadecimal
Ferramente importante para trabalhar com arquivos binrios Utilizada para editar e modicar informaes internas de arquivos binrios

x86 Assembly Course p.8/26

Inlining Assembly
Algumas linguagens possuem mecanismos para permitir a insero de cdigos assembly dentro linguagem Com isso podemos ter maior controle do noso aplicativo, no precisando manter modulos externos em Assembly que devam ser linkados juntos com a aplicao

x86 Assembly Course p.9/26

Inlining Assembly
Exemplo do uso de cdigo Assembly na linguagem C/C++

__asm() { pusha xor ax, ax popa }

x86 Assembly Course p.10/26

Arquitetura 8086
CPU Registradores de 16 bits Memria Memria limitada a 1MB Dividida em segmentos 64kb Somente modo real Bytes na memria no possuem endereo nico Organizao little endian

x86 Assembly Course p.11/26

Arquitetura 8086
Endereamento de memria
Endereo = 16 segmento + of f set

Memria enderevel: 220 = 1M B

x86 Assembly Course p.12/26

Arquitetura 8086
Mapeamento da memria 0x00000 - 0x003FF 0x00400 - 0x005FF 0x00600 - 0x9FFFF 0xA0000 - 0xAFFFF 0xB0000 - 0xB7FFF 0xB8000 - 0xBFFFF 0xC0000 - 0xDFFFF 0xE0000 - 0xFDFFF 0xFE000 - 0xFFFFF Tabela de interrupes (ISR) rea de BIOS (BDA) rea livre Memria de vdeo EGA/VGA Memria de texto monocromtico Memria de vdeo CGA ROM instalada ROM xa ROM da BIOS
x86 Assembly Course p.13/26

Arquitetura 80386
CPU Registradores de 32 bits Memria Memria limitada a 4GB Modo real e protegido Bytes na memria possuem endereo nico Organizao little endian

x86 Assembly Course p.14/26

Sintaxes de comando
Intel mov eax, 1 mov ebx, 0ffh int 80h mov eax, [ebx] mov eax, [ebx+3] AT&T movl $1, %eax movl $0xff, %ebx int $0x80 movl (%ebx), %eax movl 3(%ebx), %eax

x86 Assembly Course p.15/26

Diretiva de dados
Diretivas de dados so utilizadas para denir espao na memria Existem duas diretivas de dados Diretivas de dados Descrio RESX Dene espao para memria DX Dene espao para memria e inicializa a rea O smbolo X deve ser trocado pelo tipo de dado desejado

x86 Assembly Course p.16/26

Diretiva de dados
Tipos de dado byte word double word quad word ten bytes Letra B W D Q T Tamanho(bits) 8 16 32 64 80

x86 Assembly Course p.17/26

Registradores
A arquitetura 8086 possui 14 registradores de 16 bits, sendo: 4 de propsito geral 5 de offset para acesso a memria 4 de segmento para acesso a memria 1 registrador de ags

x86 Assembly Course p.18/26

Registradores
Registradores de propsito geral Registrador AX BX CX DX Propsito geral Acumulador Base Contador Dados

x86 Assembly Course p.19/26

Registradores
Registradores de offset para acesso a memria Registrador IP SP BP SI DI Offset Instruction pointer Stack pointer Base pointer Source Index Destination Index

x86 Assembly Course p.20/26

Registradores
Registradores de segmento para acesso a memria Registrador CS SS DS ES Segmento Code segment Stack Segment Data Segment Extra segment

x86 Assembly Course p.21/26

Registradores
Registrador de ags Flags OF DF IF TF SF ZF AF PF CF Descrio Overow ag Direction ag Interrupt ag Trap ag Sign ag Zero ag Auniliary ag Parity ag Carry ag
x86 Assembly Course p.22/26

Registradores
A arquitetura 80386 possui registradores de 32 bits que extendem os registradores anteriores mantendo compatibilidade Os registradores de 32 bits possuem o prefxo E
AX 16b

No acessvel 16b AH 8b AL 8b
EAX 32b

x86 Assembly Course p.23/26

Instrues
Instruo mov add sub push pop jmp int call Descrio Move dados Adio aritmtica Subtrao aritmtica Empilha Desempilha Salto incondicional Interrupo Chamada

x86 Assembly Course p.24/26

Interrupes
So chamadas de funes externas A tabela interrupes se encontram no incio da memria, e chamada ISR(Interrupt Service Routine) A ISR possui o endereo das funes de cada interrupo, contendo o segmento e offset de cada uma delas Quando o comando: int 21h executado, estamos na verdade saltando para o endereo de memria que contm o cdigo da interrupo

x86 Assembly Course p.25/26

Interrupes da BIOS
Interrupo Descrio 10h Escreve caracter 13h Reseta drive L do disco Escreve no disco 16h L caracter 18h Chama Basic 19h Reseta

x86 Assembly Course p.26/26

x86 Assembly Mini-Course


Part 3

Bruno P. Evangelista bpevangelista@gmail.com

Sistema de arquivos
Quando trabalhamos com arquivos, necessitamos de um mecanismo capaz de manipular os mesmos, chamado sistema de arquivos O sistema de arquivos deve disponibilizar as operaes necessrias para manipulao arquivos, como: Listar Leitura Gravao

x86 Assembly CoursePart III p.1/18

Qual sistema utilizar?


Atualmente existem diversos sistemas de arquivos, cada um para um propsito especco FAT12, FAT32, NTFS VFAT, EXT3, EXT3, REISER Os sistemas de arquivos so desenvolvidos baseado no dispositivo que ser utilizado Alguns formatos no so adequados para dispositivos de pequenos porte, pois utilizam muito espao para fazer o gernciamento dos arquivos

x86 Assembly CoursePart III p.2/18

Qual sistema utilizar?


Um sistema de arquivos simples pode ser facilmente criado, no entanto, no isso demanda tempo Ao utilizarmos um sistema j existente, podemos fazer uso das diversas ferramentas e recursos disponveis para o mesmo

x86 Assembly CoursePart III p.3/18

Sistema FAT12
FAT12 um sistema de arquivos TODO Na FAT12 existe um ponteiro para o primeiro bloco de cada arquivo e para cada bloco lido existe, um ponteiro para o prximo bloco O sistema FAT12 formado por: Duas cpias da tabela de alocao de arquivos(FAT) Tabela de entrada de arquivos Dados dos arquivos

x86 Assembly CoursePart III p.4/18

Estrutura da FAT12
Dos 2.880 setores disponveis, 1 utilizado para boot, 32 para cabealhos, e o resto para dados Setor 0 1-9 10-18 19-32 33-2879 Utilizao Boot sector FAT Copy 1 FAT Copy 2 Root Directory Data Espao 512b 4,5kb 4,5kb 7kb 1,39mb

x86 Assembly CoursePart III p.5/18

Cabealho do boot para FAT12


A FAT12 utiliza o nicio do setor de boot para guardar as conguraes do dispositivo e vericar se o sistema vlido OSID bytesPerSector sectorsPerCluster leadingSectors numFAT maxRootDirEntries totalSectors mediaType db dw db dw db dw dw db EVANG_OS 0x0200 0x01 0x0001 0x02 0x00E0 0x0B40 0x0F0
x86 Assembly CoursePart III p.6/18

Cabealho do boot para FAT12


sectorsPerFAT sectorsPerTrack numberOfHeads hiddenSectors totalSectors2 driveNumber reserved bootSignaure volumeID volumeLabel volumeLabel FATID dw dw dw dd dd db db db dd db db db 0x0009 0x0012 0x0002 0x00000000 0x00000000 0x00 0x00 0x29 0x26185454 EVANG_OSbbb OST4bbbbbbb FAT12bbb

x86 Assembly CoursePart III p.7/18

Endereamento da FAT12
Cada entrada da tabela FAT possui 12 bits Com isso temos 212 = 4096(4kb) possveis endereos de setor Na FAT12 cada setor possi 512 bytes O que disponibiliza um endereamento total de 2mb

x86 Assembly CoursePart III p.8/18

Entradas da FAT
Cada entrada da FAT12 possui 12 bits Por isso para acessar cada entrada necessrio ler dois bytes, mas apenas 1 byte e meio utilizado Por causa disso preciso um tratamento especial para as entradas na FAT

x86 Assembly CoursePart III p.9/18

Entradas da FAT
Trecho da FAT exibida em hexadecimal, cada caracter representa um nibble de 4 bits

01 23 45 67 89 Endereo 0 endereo: 0 1 2 Endereo 1 endereo: 3 4 5 Endereo 2 endereo: 6 7 8

x86 Assembly CoursePart III p.10/18

Entradas de arquivo
Para localizarmos os arquivos em disco necessrio consultar a tabela de arquivos Byte 0-7 8-10 11 12-21 22-23 24-25 26-27 28-31 Descrio Nome do arquivo Extenso Atributos Reservados Hora Data Endereo do primeiro cluster Tamanho do arquivo
x86 Assembly CoursePart III p.11/18

Modos de endereamento
O tipo de endereamento utilizado pela FAT12 diferente do utilizado pela controladora do disco Basicamente existem dois tipos de endereamento CHS - Cylinder, Head, Sector LBA - Logical block address A controladora do disco trabalha com o endereamento CHS

x86 Assembly CoursePart III p.12/18

Modos de endereamento
A BIOS possui interrupes para trabalhar com LBA, no entando o cdigo utilizado grande, por isso geralmente utilizado o endereamento CHS no boot Para acessarmos o endereo do arquivo necessrio ento fazer uma converso entre os tipos de arquivo, como ilustra o desenho abaixo FAT12 LBA CHS

x86 Assembly CoursePart III p.13/18

Transformao LBA para CHS


Sector = LBA % SectorsPerTrack + 1 Head = (LBA / SectorsPerTrack) % NumberOfHeads Cylinder = (LBA / SectorsPerTrack) / NumberOfHeads

x86 Assembly CoursePart III p.14/18

Transformao FAT para LBA


O FAT comea a enderear a partir da rea livre, setor 33 (0 a 32 esto ocupados) Mas importante lembrar que os dois primeiros endereos de entrada do FAT so reservadas Ento o endereo do bloco 33 na FAT12 2 Portanto para converter um FAT para LBA basta somar 31 ao nmero do bloco

x86 Assembly CoursePart III p.15/18

Funes bsicas do driver


FAT12 START Carrega todos os cabealhos do sistema para a memria, em uma rea segura FAT12 READ Carrega um arquivo pelo nome, e grava em uma rea disponvel da memria LBA READ Carrega um setor LBA para a memria

x86 Assembly CoursePart III p.16/18

Testando o driver
Crie vrios arquivos com 512 caracteres, cada um formado por uma sequncia do mesmo caracter aaaaaaaa bbbbbbbb Execute a operao de leitura e em seguida de exibio para cada um dos arquivos e veja se o resultado est correto Concatene os arquivos em grupos de 3, tamanho 1.5kb, e execute a operao de leitura e exibio novamente Se aps vrios testes tudo ocorreu bem, seu sistema de arquivos est funcionando corretamente
x86 Assembly CoursePart III p.17/18

Informaes adicionais
Google - www.google.com Um dos seus melhores amigos, no deixe de perguntar para ele! =D Intel - www.intel.com Disponibiliza manual sobre a arquitetura x86, alm de vrias ferramentas para desenvolvedores

x86 Assembly CoursePart III p.18/18

Você também pode gostar