Las interrupciones permiten a la CPU pausar la tarea que estuviese haciendo en ese momento para ejecutar otra de mayor prioridad y poder volver a la tarea original una vez atendida la prioritaria. Las interrupciones pueden ser disparadas tanto por software(int 0x10) como por hardware(la llegada de un paquete por red). En este artÃculo utilizaremos la int0x10 para pintar por pantalla un texto.
Antes de comenzar es recomendable que leas este artÃculo anterior:
Cada interrupción es representada por un id único, con este Ãndice se consulta una tabla(interrupt vector) que fué cargada por la BIOS en dirección fÃsica 0x0 donde se relaciona el id con un puntero a una dirección de memoria donde se encuentra la rutina asociada a la interrupción(interrupt service routine - ISR)
Para imprimir carácteres por pantalla vamos a utilizar la interrupción 0x10 , esta interrupción se encarga de las funciones de pantalla, según el valor del registro ah realizará una función u otra.
Si asignamos el valor 0x0e al registro ah imprimirá un carácter por pantalla y avanzará el cursor listo para el siguiente carácter, el registro al se leerá para saber que carácter se debe imprimir, procedemos con nuestro programa en ASM.
mov ah, 0x0e ; tty mode
mov al, 'H'
int 0x10
mov al, 'e'
int 0x10
mov al, 'l'
int 0x10
int 0x10
mov al, 'o'
int 0x10
jmp $ ; jump to current address = infinite loop
; padding and magic number
times 510 - ($-$$) db 0
dw 0xaa55
Generamos la imagen:
Arrancamos qemu con nuestra imagen:
SeaBIOS (version rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org)
iPXE (http://ipxe.org) 00:03.0 C980 PCI2.10 PnP PMM+07F91410+07EF1410 C980
Booting from Hard Disk...
Hello
IncreÃble, hemos conseguido imprimir carácteres por pantalla llamando las interrupciones básicas de la BIOS.