Oficina
8. O loader Numaboa
Sab 26 Mai 2007 16:20 |
- Detalhes
- Categoria: Sistemas Operacionais
- Atualização: Domingo, 12 Abril 2009 17:38
- Autor: vovó Vicki
- Acessos: 13505
MÓDULO 8 do SO Numaboa
Um loader com apenas um loop infinito foi um bom começo mas, para dizer a verdade, quando o testei pela primeira vez fiquei desconfiada. Será que o setor de boot estava realmente funcionando como pretendido? Numa situação como esta, um dos testes que podem ser efetuados é adicionar algum código que dê saída de um caracter ou de uma string para a tela: se aparecer na tela - funcionou, se não aparecer na tela - deu caca.
Entra aí uma novidade: é preciso saber como dar saída para a tela e a única opção que temos é usar uma das rotinas da BIOS fazendo um chamado de interrupção.
As interrupções da BIOS
As interrupções da BIOS são uma mão na roda. Oferecem uma série de rotinas básicas (daí o nome de Basic Input/Output Services) que podem ser acessadas via interrupções de hardware. Da extensa lista de interrupções disponíveis, a que nos interessa no momento é a INT 10.
A INT 10 é conhecida como Serviços da BIOS para Vídeo (Video BIOS Services). A INT 10 aciona uma porção de rotinas diferentes (mais de 25) dependendo do valor colocado na porção alta do registrador EAX (nos sistemas de 32 bits - AX nos sistemas de 16 bits). INT 10 com AH=00, por exemplo, configura o modo de vídeo; INT 10 com AH=06, rola a página para cima; INT 10 com AH=0C, escreve um pixel gráfico nas coordenadas, etc.
Para uma lista completa das interrupções da BIOS e seus respectivos serviços ou rotinas procure literatura técnica especializada (veja nas considerações finais deste texto). Uma descrição detalhada não faz parte deste tutorial.
A INT 10 com AH=0E
A rotina que nos interessa é a INT 10 com AH=0E, que escreve texto em modo teletipo (modo teletipo é quando o cursor avança uma posição depois de escrever um caracter). Os valores, todos em notação hexadecimal, que podem ser enviados para a BIOS através dos registradores são:
AH = 0E AL = ASCII do caracter que deve ser escrito na porção baixa do registrador EAX ou AX (Low = baixa) BH = número da página de vídeo (modos texto) na porção alta do registrador EBX ou BX (High = alta) BL = cor de frente e de fundo dos pixels (modos gráficos) na porção baixa do registrador EBX ou BX - não há valor de retorno - o cursor avança depois da escrita - caracteres BEL (07), BS (08), LF (0A), and CR (0D) são tratados como códigos de controle
Uma letra na tela
Vamos completar o código do boot loader de loop infinito, escrito no módulo anterior, para colocar uma letra na tela. A letra escolhida será a letra A, cujo ASCII em notação decimal é 65.
Entre o marcador do início do programa e o loop infinito estão algumas instruções MOV para MOVer valores para determinadas porções dos registradores AX e BX. Não se esqueça de que estamos trabalhando com 16 bits. Neste caso, os registradores aceitam apenas 16 bits e recebem o nome de AX, BX, CX, etc. Caso estivéssemos trabalhando com 32 bits, os registradores aceitariam 32 bits e receberiam o nome de EAX, EBX, ECX, etc. Na porção baixa de BX (bl) inserimos o valor 07, que determina texto branco em fundo preto. Você pode tentar outros valores para obter outras combinações de cores.
Conferindo o loader Numaboa
Escreva o código do exemplo e grave-o como loader2.asm (ou outro nome qualquer). Compile-o com o NASM usando nasm.exe -f bin loader2.asm -o loader2.bin ou com o NASM para Windows usando nasmw.exe -f bin loader2.asm -o loader2.bin. Abra o loader2.bin num editor hexadecimal e verifique:
0000 0000 B4 0E B0 41 B7 00 B3 07 CD 10 EB FE 00 00 00 00 0000 0010 00 00 00 00 ... ... 0000 01F0 ... 00 00 00 00 00 00 55 AA
Se o código compilado estiver ok, transfira-o para o setor de boot de um disquete (você pode formatar o disquete usado anteriormente para reutilizá-lo) e teste-o (como explicado no módulo anterior).
- Anterior
- Próximo >>