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

12. O loader Numaboa II

Dom

27

Mai

2007


07:24

(7 votos, média 3.86 de 5) 


Dando acabamento ao setor de boot

Agora só faltam dois detalhes para acabar o setor de boot. O primeiro é completar os 512 bytes de que ele precisa e colocar a assinatura 55AA nos dois últimos. O segundo é fazer um salto para o buffer de memória onde se encontra o código que deve ser executado. Mas que código? Calma, é o que ainda vamos programar smile Por enquanto, o acabamento:

[ORG 7C00h] ; Onde a BIOS nos coloca ; --------------------------------------------------------- ; Programa principal ; --------------------------------------------------------- inicio: ; Configurar a pilha. ; Não podemos permitir interrupções durante a configuração cli ; Disabilitar interrupções mov ax, 0x9000 ; Por a pilha em 9000:0000 mov ss, ax ; Transferir o endereço para o registrador ; do segmento da pilha (SS) mov sp, 0 ; Zerar ponteiro do topo da pilha sti ; Habilitar interrupções (SeT Interrupts bit) mov [bootdrv], dl ; DL indica o drive de boot call carregar ; Chamar a função que reseta a controladora ; e faz a leitura de setores do disco jmp far 1000h:0 <--- Salta para o buffer com o código ; --------------------------------------------------------- ; Funções e variáveis do nosso bootstrap ; ---------------------------------------------------------- bootdrv db 0 ; A identificação do drive de boot carregar: push ds ; Preserva o valor do segmento de dados na pilha .reset: mov ax, 0 ; Serviço que reseta o sistema de disco mov dl, [bootdrv] ; Drive que deve ser resetado int 13h ; INT 13 faz o reset jc .reset ; Falhou -> Tentar novamente (jc=jump on carry) pop ds ; Retoma o valor do segmento de dados da pilha .leitura: mov ax,0x1000 ; O buffer deve ficar em 1000:0000 mov es,ax ; Transfere 1000 para ES (Extra Segment) mov bx, 0 ; e transfere 0 de deslocamento para BX ; O resultado é ES:BX com 1000:0000 mov ah, 2 ; Serviço 2 da INT 13 => Ler setores de disco mov al, 5 ; Ler 5 setores (é mais do que suficiente) mov cx, 2 ; Cilindro=0, Setor=2 mov dh, 0 ; Cabeça=0 mov dl, [bootdrv] ; Drive=drive de boot int 13h ; Leia! ES:BX = dados do disco jc .leitura ; falhou -> Tente novamente retn ; Terminada a leitura, retornar <--- ACABAMENTO times 512-($-$$)-2 db 0 ; Preenche com 0 até setor ter 512 bytes dw 0AA55h ; Põe a assinatura do setor de boot

Observe a nova maneira de colocar a assinatura nos dois últimos bytes: dw 0AA55h. Não é erro de digitação, os bytes estão invertidos mesmo. Digamos, por enquanto, que o computador os escreve ao contrário ou... que os escreve da direita para a esquerda. É o little endian em ação smile Observe também que o salto incondicional jmp far 1000:0 possui o adicional far. Far significa longe, portanto trata-se de um salto longo. É necessário porque o salto deve ser feito para um segmento diferente do segmento atual.

O setor de boot está prontinho. Agora é só salvar com o nome de loader3.asm e compilar este código com nasm loader3.asm -f bin -o loader3.bin.

Informações adicionais