A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Oficina

8. O loader Numaboa

Sab

26

Mai

2007


16:20

(6 votos, média 5.00 de 5) 


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

[BITS 16] ; Código de 16 bits [ORG 0x7C00] ; Origem do código em 7C00 principal: ; Marcador do início do programa mov ah,0x0E ; Indica a rotina de teletipo da BIOS mov al,65 ; O valor ASCII do caracter a ser escrito mov bh,0x00 ; Número da página de vídeo mov bl,0x07 ; Atributos do texto (Controla a cor de frente ; e a cor de fundo). 07 é texto branco em fundo ; preto int 0x10 ; Chamar a interrupção de vídeo da BIOS pendura: jmp pendura ; O loop infinito ; Para terminar times 510-($-$$) db 0 ; Preenche o resto do setor com zeros db 0x55,0xAA ; Põe a assinatura do boot loader no final

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

Informações adicionais