Upload
nguyenxuyen
View
248
Download
4
Embed Size (px)
Citation preview
Introdução
Assembly é uma linguagem de programação debaixo nível em formato mnemonico
Ela possibilita trabalhar diretamente com oprocessador da máquina, executando operações quemuitas vezes não são possíveis em linguagens dealto nível
x86 Assembly Course – p.1/26
Porque utilizar?
Muito utilizado no desenvolvimento de aplicativosque exigem resposta em tempo real
Tirar proveito de conjuntos de instruções específicasdos processadores: SSE, SSE2, SSE3, 3DNOW,outros
Obter conhecimento do funcionamento do hardware,visando desenvolver softwares de melhor qualidade
x86 Assembly Course – p.2/26
Utilização em softwares
Muitas vezes os aplicativos precisam de umdesempenho maior em partes críticas do código
Nesses techos devem ser utilizados algoritmosotimizados, com baixa ordem de complexidade
Mesmo com o uso de um algoritmo adequado, podenão ser possível atingir o tempo de respostanecessário
Nesses casos, podemos tentar melhorar aperformance utilizando otimizações de baixo nível
x86 Assembly Course – p.3/26
Problemas
Otimizações de baixo nível não podem serprogramadas em linguagens de alto nível comoC/C++ ou Java
Quando fazemos otimizações de baixo nível,estamos confiando mais em nós mesmo, que nocompilador para fazer a geração de código
Muitas vezes otimizações de baixo nível não são asolução para gargalos no desempenho, sendonecessário trocar a ordem de complexidade doalgoritmo utilizado
x86 Assembly Course – p.4/26
Ferramentas utilizadas
Principais:Editor de código- Não existem IDEs com grandes recursos, devidoas limitações da linguagemMontador
Utilitários:DepuradorEditor hexadecimal
x86 Assembly Course – p.5/26
Montadores
Um dos primos do compilador
O papel do montador é transformar os mnemonicos emcódigo de máquina
Existem vários montadores para a linguagemAssembly:
MASM - Microsoft AssemblerNASM - Netwide Assembler(Versões para diferentes plataformas)TASM - Turbo Assembler (Borland)
x86 Assembly Course – p.6/26
Depurador
Ferramenta extremamente importante para encontrarerros cometidos durante a programação
Erros cometidos durante a programação geralmentetravam a máquina, não sendo possível detecta-locom facilidade
Um erro cometido na 10 linha de código geralmentesó é percebido centenas de linhas para frente, longede onde o erro foi cometido
x86 Assembly Course – p.7/26
Editor hexadecimal
Ferramente importante para trabalhar com arquivosbinários
Utilizada para editar e modificar informaçõesinternas de arquivos binários
x86 Assembly Course – p.8/26
Inlining Assembly
Algumas linguagens possuem mecanismos parapermitir a inserção de códigos assembly dentrolinguagem
Com isso podemos ter maior controle do nosoaplicativo, não precisando manter modulos externosem Assembly que devam ser linkados juntos com aaplicação
x86 Assembly Course – p.9/26
Inlining Assembly
Exemplo do uso de código Assembly na linguagemC/C++
__asm() {
pusha
xor ax, ax
popa
}
x86 Assembly Course – p.10/26
Arquitetura 8086
CPU Registradores de 16 bitsMemória Memória limitada a 1MB
Dividida em segmentos 64kbSomente modo realBytes na memória não possuemendereço únicoOrganização little endian
x86 Assembly Course – p.11/26
Arquitetura 8086
Endereçamento de memória
Endereço = 16 ∗ segmento + offset
Memória endereçável: 220 = 1MB
x86 Assembly Course – p.12/26
Arquitetura 8086
Mapeamento da memória
0x00000 - 0x003FF Tabela de interrupções (ISR)0x00400 - 0x005FF Área de BIOS (BDA)0x00600 - 0x9FFFF Área livre0xA0000 - 0xAFFFF Memória de vídeo EGA/VGA0xB0000 - 0xB7FFF Memória de texto monocromático0xB8000 - 0xBFFFF Memória de vídeo CGA0xC0000 - 0xDFFFF ROM instalada0xE0000 - 0xFDFFF ROM fixa0xFE000 - 0xFFFFF ROM da BIOS
x86 Assembly Course – p.13/26
Arquitetura 80386
CPU Registradores de 32 bitsMemória Memória limitada a 4GB
Modo real e protegidoBytes na memória possuemendereço únicoOrganização little endian
x86 Assembly Course – p.14/26
Sintaxes de comando
Intel AT&Tmov eax, 1 movl $1, %eaxmov ebx, 0ffh movl $0xff, %ebxint 80h int $0x80mov eax, [ebx] movl (%ebx), %eaxmov eax, [ebx+3] movl 3(%ebx), %eax
x86 Assembly Course – p.15/26
Diretiva de dados
Diretivas de dados são utilizadas para definir espaçona memória
Existem duas diretivas de dados
Diretivas de dados DescriçãoRESX Define espaço para memóriaDX Define espaço para memória
e inicializa a área
O símbolo X deve ser trocado pelo tipo de dadodesejado
x86 Assembly Course – p.16/26
Diretiva de dados
Tipos de dado Letra Tamanho(bits)byte B 8word W 16double word D 32quad word Q 64ten bytes T 80
x86 Assembly Course – p.17/26
Registradores
A arquitetura 8086 possui 14 registradores de 16bits, sendo:
4 de propósito geral5 de offset para acesso a memória4 de segmento para acesso a memória1 registrador de flags
x86 Assembly Course – p.18/26
Registradores
Registradores de propósito geral
Registrador Propósito geralAX AcumuladorBX BaseCX ContadorDX Dados
x86 Assembly Course – p.19/26
Registradores
Registradores de offset para acesso a memória
Registrador OffsetIP Instruction pointerSP Stack pointerBP Base pointerSI Source IndexDI Destination Index
x86 Assembly Course – p.20/26
Registradores
Registradores de segmento para acesso a memória
Registrador SegmentoCS Code segmentSS Stack SegmentDS Data SegmentES Extra segment
x86 Assembly Course – p.21/26
Registradores
Registrador de flags
Flags DescriçãoOF Overflow flagDF Direction flagIF Interrupt flagTF Trap flagSF Sign flagZF Zero flagAF Auniliary flagPF Parity flagCF Carry flag
x86 Assembly Course – p.22/26
Registradores
A arquitetura 80386 possui registradores de 32 bitsque extendem os registradores anteriores mantendocompatibilidade
Os registradores de 32 bits possuem o prefíxo “E”
Não acessível 16b
AX 16b︷ ︸︸ ︷
AH 8b AL 8b︸ ︷︷ ︸
EAX 32b
x86 Assembly Course – p.23/26
Instruções
Instrução Descriçãomov Move dadosadd Adição aritméticasub Subtração aritméticapush Empilhapop Desempilhajmp Salto incondicionalint Interrupçãocall Chamada
x86 Assembly Course – p.24/26
Interrupções
São chamadas de funções externas
A tabela interrupções se encontram no início damemória, e é chamada ISR(Interrupt ServiceRoutine)
A ISR possui o endereço das funções de cadainterrupção, contendo o segmento e offset de cadauma delas
Quando o comando: int 21h é executado, estamosna verdade saltando para o endereço de memóriaque contêm o código da interrupção
x86 Assembly Course – p.25/26
Interrupções da BIOS
Interrupção Descrição10h Escreve caracter13h Reseta drive
Lê do discoEscreve no disco
16h Lê caracter18h Chama “Basic”19h Reseta
x86 Assembly Course – p.26/26
Sistema de arquivos
Quando trabalhamos com arquivos, necessitamos deum mecanismo capaz de manipular os mesmos,chamado sistema de arquivos
O sistema de arquivos deve disponibilizar asoperações necessárias para manipulação arquivos,como:
ListarLeituraGravação
x86 Assembly CoursePart III – p.1/18
Qual sistema utilizar?
Atualmente existem diversos sistemas de arquivos,cada um para um propósito específico
FAT12, FAT32, NTFSVFAT, EXT3, EXT3, REISER
Os sistemas de arquivos são desenvolvidos baseadono dispositivo que será utilizado
Alguns formatos não são adequados paradispositivos de pequenos porte, pois utilizam muitoespaço para fazer o gerênciamento dos arquivos
x86 Assembly CoursePart III – p.2/18
Qual sistema utilizar?
Um sistema de arquivos simples pode ser facilmentecriado, no entanto, não isso demanda tempo
Ao utilizarmos um sistema já existente, podemosfazer uso das diversas ferramentas e recursosdisponíveis 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 blocode cada arquivo e para cada bloco lido existe, umponteiro para o próximo bloco
O sistema FAT12 é formado por:Duas cópias da tabela de alocação dearquivos(FAT)Tabela de entrada de arquivosDados dos arquivos
x86 Assembly CoursePart III – p.4/18
Estrutura da FAT12
Dos 2.880 setores disponíveis, 1 é utilizado paraboot, 32 para cabeçalhos, e o resto para dados
Setor Utilização Espaço0 Boot sector 512b1-9 FAT Copy 1 4,5kb10-18 FAT Copy 2 4,5kb19-32 Root Directory 7kb33-2879 Data 1,39mb
x86 Assembly CoursePart III – p.5/18
Cabeçalho do boot para FAT12
A FAT12 utiliza o ínicio do setor de boot para guardaras configurações do dispositivo e verificar se osistema é válido
OSID db ’EVANG_OS’bytesPerSector dw 0x0200sectorsPerCluster db 0x01leadingSectors dw 0x0001numFAT db 0x02maxRootDirEntries dw 0x00E0totalSectors dw 0x0B40mediaType db 0x0F0
x86 Assembly CoursePart III – p.6/18
Cabeçalho do boot para FAT12
sectorsPerFAT dw 0x0009sectorsPerTrack dw 0x0012numberOfHeads dw 0x0002hiddenSectors dd 0x00000000totalSectors2 dd 0x00000000driveNumber db 0x00reserved db 0x00bootSignaure db 0x29volumeID dd 0x26185454volumeLabel db ’EVANG_OSbbb’volumeLabel db ’OST4bbbbbbb’FATID db ’FAT12bbb’ x86 Assembly CoursePart III – p.7/18
Endereçamento da FAT12
Cada entrada da tabela FAT possui 12 bits
Com isso temos 212 = 4096(4kb) possíveis
endereços de setor
Na FAT12 cada setor possúi 512 bytes
O que disponibiliza um endereçamento 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 é necessário lerdois bytes, mas apenas 1 byte e meio é utilizado
Por causa disso é preciso um tratamento especialpara as entradas na FAT
x86 Assembly CoursePart III – p.9/18
Entradas da FAT
Trecho da FAT exibida em hexadecimal, cadacaracter representa um nibble de 4 bits
01 23 45 67 89
Endereço 0 endereço: 0 1 2
Endereço 1 endereço: 3 4 5
Endereço 2 endereço: 6 7 8
x86 Assembly CoursePart III – p.10/18
Entradas de arquivo
Para localizarmos os arquivos em disco é necessárioconsultar a tabela de arquivos
Byte Descrição0-7 Nome do arquivo8-10 Extensão11 Atributos12-21 Reservados22-23 Hora24-25 Data26-27 Endereço do primeiro cluster28-31 Tamanho do arquivo
x86 Assembly CoursePart III – p.11/18
Modos de endereçamento
O tipo de endereçamento utilizado pela FAT12 édiferente do utilizado pela controladora do disco
Basicamente existem dois tipos de endereçamentoCHS - Cylinder, Head, SectorLBA - Logical block address
A controladora do disco trabalha com oendereçamento CHS
x86 Assembly CoursePart III – p.12/18
Modos de endereçamento
A BIOS possui interrupções para trabalhar com LBA,no entando o código utilizado é grande, por issogeralmente é utilizado o endereçamento CHS noboot
Para acessarmos o endereço do arquivo énecessário então fazer uma conversão entre os tiposde arquivo, como ilustra o desenho abaixo
FAT12 −→ LBA −→ CHS
x86 Assembly CoursePart III – p.13/18
Transformação LBA para CHS
Sector = LBA % SectorsPerTrack + 1
Head = (LBA / SectorsPerTrack) % NumberOfHeads
Cylinder = (LBA / SectorsPerTrack) /NumberOfHeads
x86 Assembly CoursePart III – p.14/18
Transformação FAT para LBA
O FAT começa a endereçar a partir da área livre,setor 33 (0 a 32 estão ocupados)
Mas é importante lembrar que os dois primeirosendereços de entrada do FAT são reservadas
Então o endereço do bloco 33 na FAT12 é 2
Portanto para converter um FAT para LBA bastasomar 31 ao número do bloco
x86 Assembly CoursePart III – p.15/18
Funções básicas do driver
FAT12 STARTCarrega todos os cabeçalhos do sistema para amemória, em uma área segura
FAT12 READCarrega um arquivo pelo nome, e grava em umaárea disponível da memória
LBA READCarrega um setor LBA para a memória
x86 Assembly CoursePart III – p.16/18
Testando o driver
Crie vários arquivos com 512 caracteres, cada umformado por uma sequência do mesmo caracter
aaaaaaaabbbbbbbb
Execute a operação de leitura e em seguida deexibição para cada um dos arquivos e veja se oresultado está correto
Concatene os arquivos em grupos de 3, tamanho1.5kb, e execute a operação de leitura e exibiçãonovamente
Se após vários testes tudo ocorreu bem, seu sistemade arquivos está funcionando corretamente
x86 Assembly CoursePart III – p.17/18
Informações adicionais
Google - www.google.comUm dos seus melhores amigos, não deixe deperguntar para ele! =D
Intel - www.intel.comDisponibiliza manual sobre a arquitetura x86,além de várias ferramentas para desenvolvedores
x86 Assembly CoursePart III – p.18/18