Skip to main content

Bootloader

Explicación del Bootloader

Este código corresponde al bootloader de DariOS

Bootloader


Encabezado

org 0x7c00
bits 16
  • org 0x7C00: Define que el código se cargará en la dirección de memoria 0x7C00, que es donde la BIOS carga el bootloader.
  • bits 16: Indica que el código es para 16 bits (modo real).

Inicio del programa

start:
jmp main
  • Salta directamente a la etiqueta main, que contiene el código principal.

Limpieza de pantalla y colocación del cursor

main:
push ax
push bx
push cx
push dx
  • Se guardan los registros ax, bx, cx, y dx para no perder su contenido original.
    mov ah, 0x06
mov al, 0
mov bh, 0x07
mov cx, 0x0000
mov dx, 0x184F
int 0x10
  • Usa la interrupción 0x10 para limpiar la pantalla.
  • AH=06h borra líneas de texto.
  • AL=0 indica que se borra toda la pantalla.
  • BH=07h define el color (gris sobre fondo negro).
  • CX y DX definen la región a limpiar (toda la pantalla).
    mov ah, 0x02
mov bh, 0x00
mov dh, 0x09
mov dl, 0x25
int 0x10
  • Mueve el cursor a la posición centrada (fila 9, columna 37).

Muestra un mensaje de bienvenida

    mov si, mensaje_bienvenida
call imprimir_cadena
  • Mueve la dirección de la cadena de bienvenida al registro SI.
  • Llama a la subrutina imprimir_cadena (incluida desde funciones_globales.inc) para mostrar el mensaje.
    mov si, mensaje_kernel
call imprimir_cadena
  • Muestra otro mensaje desde la variable mensaje_kernel.
  • La suma de estos mensajes aparenta ser un SO real.

Saltar al kernel

    call leer_caracter
  • Llama a una rutina que espera una entrada del usuario, y cuando leemos el caracter sigue el codigo para saltar al kernel
    mov ah, 0x02
mov al, 4
mov ch, 0
mov cl, 2
mov dh, 0
mov bx, 0x1000
int 0x13
  • Interrupción 0x13 para leer sectores del disco.
  • AH=02h indica lectura.
  • AL=4 indica que se leerán 4 sectores.
  • CH=0, CL=2, DH=0 definen la ubicación del sector en CHS.
  • BX=0x1000 es la dirección de memoria donde se cargará el contenido.
    jmp 0x1000
  • Salta a la dirección 0x1000 para ejecutar el código cargado.
main:
pop ax
pop bx
pop cx
pop dx
  • Devuelve los valores que guardamos antes en la pila

Inclusión de archivos

%include "libs/variables.inc"
%include "libs/funciones_globales.inc"
  • Incluye variables y funciones externas definidas en otros archivos.

Final del bootloader

times 510-($-$$) db 0
dw 0xAA55
  • Rellena el archivo hasta 510 bytes con ceros.
  • 0xAA55 es la firma del sector de arranque que la BIOS necesita para considerar el disco como booteable.