Oficina
12. O loader Numaboa II
- Detalhes
-
Categoria: Sistemas Operacionais
-
Atualização: Quinta, 03 Abril 2008 14:51
-
Autor: vovó Vicki
-
Acessos: 12304
Pagina 3 de 4
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 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 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.