assembly - example - interrupciones 14h
¿Cómo manejar el teclado en modo real a través de interrupciones de BIOS? (3)
Ejemplo de BIOS del sector de arranque de Minimal Gas:
.code16
.global _start
_start:
cli
/* Set SS and SP as they may get used by BIOS calls. */
xor %ax, %ax
mov %ax, %ss
mov 0x0000, %sp
/* Get input to %al */
mov $0x00, %ah
int $0x16
/* Print the input from %al */
mov $0x0E, %ah
int $0x10
hlt
.org 510
.word 0xaa55
Compilar y ejecutar:
as -o main.o main.S
ld --oformat binary -o main.img -Ttext 0x7C00 main.o
qemu-system-i386 -hda main.img
O simplemente clone este repositorio y ejecute make run RUN=bios_keyboard
.
Luego, cuando ingresas un personaje, se imprime en la pantalla.
Probado en Ubuntu 14.04 AMD64, Binutils 2.24, QEMU 2.0.0 y en hardware real Lenovo Thinkpad T400.
Tengo que codificar un sistema operativo en el que pueda ejecutar una calculadora. Es como una calculadora de escritorio. Para esto estoy leyendo la serie de desarrollo operativo de Brokenthorn. He completado la segunda etapa del gestor de arranque. El gestor de arranque está en modo real. Después de esto, el autor está explicando el modo protegido. No quiero usar el modo protegido. No tengo tiempo para eso. Así que quiero escribir la calculadora en modo real mediante el uso de interrupciones de BIOS. ¿Es posible? Creo que se puede escribir en la segunda etapa del gestor de arranque (no estoy seguro). Significa que no tengo que usar un kernel (no estoy seguro). No sé cómo usar interrupciones de BIOS para manejar el teclado. ¿Alguien puede proporcionarme un enlace que me ayude en esto? Y si algo está mal en lo que supuse que es incorrecto, corrígeme. Gracias de antemano.
Puede manejar IRQ 1 (asignado a la interrupción 9 por el controlador x86) y leer las claves del puerto 60h
.
Ver http://inglorion.net/documents/tutorials/x86ostut/keyboard/ .
Si desea utilizar servicios de teclado BIOS de alto nivel, en lugar de manejar las interrupciones del teclado usted mismo, entonces INT 16h
es lo que desea.
INT 16h
con AH=00h
o 10h
bloqueará la espera de una pulsación de tecla (devuelve el resultado ASCII en AL
); use AH=01h
u 11h
para consultar si una pulsación de tecla está disponible primero si desea evitar el bloqueo (vuelve inmediatamente con ZF
despejado si hay una clave disponible, o configurada si no). Ver, por ejemplo, aquí , o aquí (o Google "INT 16h" para más información).