Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ---------------------------------------------------------
- ; Bootstrap by José Ferreira at (sei lá)
- ; ---------------------------------------------------------
- ;O programa desbilita as interrupções, aloca a pilha, traz as interrupções de volta,
- ;carrega um arquivo na memória e pula para o código dele.
- [BITS 16]
- [ORG 0]
- ; ---------------------------------------------------------
- ; MAIN DO BOOTSTRAP
- ; ---------------------------------------------------------
- inicio:
- ; Configurar a pilha.
- ; Não podemos permitir interrupções durante a configuração
- mov ax,0x7c0 ; A BIOS nos coloca em 0:07C00h, dai setamos DS
- mov ds,ax ; Entretanto, nos não precisamos colocar 07C00h para tudo
- 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 si, ReadKernel
- call poeString
- 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
- mov si, StartKernel
- call poeString
- ;loopInfinito:
- ; jmp loopInfinito
- jmp 1000h:0 ;<--- Salta para o buffer com o código do "kernel"
- ; ---------------------------------------------------------
- ; Funções auxiliares e variáveis do nosso bootstrap
- ; ----------------------------------------------------------
- carregar:
- mov si, ResetControler
- call poeString
- 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
- ;------------ imprime uma string na tela (SI=ponteiro para a string) ----------------
- poeString:
- lodsb ; Copia o byte em DS:SI para AL e incrementa SI
- or al,al ; Verifica se o byte lido é zero
- jz volta ; Se sim, salta para volta
- mov ah,0x0E ; Serviço 0E da INT 10 da BIOS (Imprimir caracter)
- mov bh,0x00 ; Número da página de vídeo
- mov bx,0x07 ; Imprimir branco em fundo preto
- int 0x10 ; Imprimir caracter
- jmp poeString ; Pegar próximo caracter
- volta:
- retn ; Terminada a tarefa, voltar ao ponto de chamada
- ; ---------------------------------------------------------
- ; CONSTANTES E VARIAVEIS
- ; ---------------------------------------------------------
- ReadKernel db 'Lendo arquivo do kernel.',13,10,0
- StartKernel db 'Executando o Kernel',13,10,0
- ResetControler db 'Fazendo reset da controladora.',13,10,0
- bootdrv db 0 ; A identificação do drive de boot
- ;<--- ACABAMENTO
- times 512-($-$$)-2 db 0 ; Preenche com 0 até setor ter 512 bytes
- dw 0AA55h ; Põe a assinatura do setor de boot
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement