Advertisement
DavidsonDFGL

Loader

Jul 24th, 2013
368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ---------------------------------------------------------
  2. ; Bootstrap by José Ferreira at (sei lá)
  3. ; ---------------------------------------------------------
  4. ;O programa desbilita as interrupções, aloca a pilha, traz as interrupções de volta,
  5. ;carrega um arquivo na memória e pula para o código dele.
  6.  
  7. [BITS 16]
  8. [ORG 0]                
  9.  
  10. ; ---------------------------------------------------------
  11. ; MAIN DO BOOTSTRAP
  12. ; ---------------------------------------------------------
  13.  
  14. inicio:
  15.     ; Configurar a pilha.
  16.     ; Não podemos permitir interrupções durante a configuração
  17.    
  18.     mov ax,0x7c0    ; A BIOS nos coloca em 0:07C00h, dai setamos DS
  19.         mov ds,ax       ; Entretanto, nos não precisamos colocar 07C00h para tudo
  20.    
  21.     cli                     ; Disabilitar interrupções
  22.     mov ax, 0x9000          ; Por a pilha em 9000:0000
  23.     mov ss, ax              ; Transferir o endereço para o registrador
  24.                             ; do segmento da pilha (SS)
  25.                            
  26.     mov sp, 0               ; Zerar ponteiro do topo da pilha
  27.     sti                     ; Habilitar interrupções (SeT Interrupts bit)
  28.    
  29.         mov si, ReadKernel
  30.         call poeString
  31.    
  32.     mov [bootdrv], dl       ; DL indica o drive de boot
  33.     call carregar           ; Chamar a função que reseta a controladora
  34.                             ; e faz a leitura de setores do disco
  35.  
  36.         mov si, StartKernel
  37.         call poeString
  38.    
  39. ;loopInfinito:    
  40. ;   jmp loopInfinito
  41.        
  42.     jmp 1000h:0      ;<--- Salta para o buffer com o código do "kernel"
  43.  
  44. ; ---------------------------------------------------------
  45. ; Funções auxiliares e variáveis do nosso bootstrap
  46. ; ----------------------------------------------------------
  47.  
  48. carregar:
  49.  
  50.    mov si, ResetControler
  51.    call poeString
  52.    
  53.    push ds              ; Preserva o valor do segmento de dados na pilha
  54.  
  55. .reset:
  56.    mov ax, 0            ; Serviço que reseta o sistema de disco
  57.    mov dl, [bootdrv]    ; Drive que deve ser resetado
  58.    int 13h              ; INT 13 faz o reset
  59.    jc .reset            ; Falhou -> Tentar novamente (jc=jump on carry)
  60.  
  61.    pop ds               ; Retoma o valor do segmento de dados da pilha
  62.  
  63. .leitura:
  64.    mov ax,0x1000        ; O buffer deve ficar em 1000:0000
  65.    mov es,ax            ; Transfere 1000 para ES (Extra Segment)
  66.    mov bx, 0            ; e transfere 0 de deslocamento para BX
  67.                         ; O resultado é ES:BX com 1000:0000
  68.  
  69.    mov ah, 2            ; Serviço 2 da INT 13 => Ler setores de disco
  70.    mov al, 5            ; Ler 5 setores (é mais do que suficiente)
  71.    mov cx, 2            ; Cilindro=0, Setor=2
  72.    mov dh, 0            ; Cabeça=0
  73.    mov dl, [bootdrv]    ; Drive=drive de boot
  74.    int 13h              ; Leia! ES:BX = dados do disco
  75.    jc .leitura          ; falhou -> Tente novamente
  76.  
  77.    retn                 ; Terminada a leitura, retornar
  78.  
  79. ;------------ imprime uma string na tela (SI=ponteiro para a string) ----------------
  80.  
  81. poeString:
  82.    lodsb                ; Copia o byte em DS:SI para AL e incrementa SI
  83.    or al,al             ; Verifica se o byte lido é zero
  84.    jz volta             ; Se sim, salta para volta
  85.    mov ah,0x0E          ; Serviço 0E da INT 10 da BIOS (Imprimir caracter)
  86.    mov bh,0x00          ; Número da página de vídeo
  87.    mov bx,0x07          ; Imprimir branco em fundo preto
  88.    int 0x10             ; Imprimir caracter
  89.    jmp poeString        ; Pegar próximo caracter
  90.    
  91. volta:
  92.    retn                  ; Terminada a tarefa, voltar ao ponto de chamada
  93.  
  94. ; ---------------------------------------------------------
  95. ; CONSTANTES E VARIAVEIS
  96. ; ---------------------------------------------------------
  97.  
  98. ReadKernel          db 'Lendo arquivo do kernel.',13,10,0  
  99. StartKernel         db 'Executando o Kernel',13,10,0      
  100. ResetControler      db 'Fazendo reset da controladora.',13,10,0  
  101.  
  102. bootdrv db 0            ; A identificação do drive de boot
  103.  
  104.  
  105.                         ;<--- ACABAMENTO
  106. times 512-($-$$)-2 db 0 ; Preenche com 0 até setor ter 512 bytes
  107.    dw 0AA55h            ; Põe a assinatura do setor de boot
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement