Как обрабатывать клавиатуру в реальном режиме через прерывания BIOS?
Я должен написать код для операционной системы, в которой я могу запустить вычислитель. Это похоже на настольный вычислитель. Для этого я читаю серию разработки операционных систем " Сломанный шип". Я завершил второй этап загрузчика. Загрузчик работает в реальном режиме. После этого автор объясняет защищенный режим. Я не хочу использовать защищенный режим. У меня нет времени на это. Поэтому я хочу написать вычислитель в реальном режиме, используя прерывания BIOS. Является ли это возможным? Я думаю, что это может быть написано на втором этапе загрузчика (я не уверен.) Означает, что мне не нужно использовать ядро (я не уверен). Я не знаю, как использовать прерывания BIOS для обработки клавиатуры. Кто-нибудь может дать мне ссылку, которая поможет мне в этом? И если что-то не так в том, что я предположил выше, неправильно, пожалуйста, поправьте меня. Спасибо заранее.
3 ответа
Если вы хотите использовать высокоуровневые сервисы клавиатуры BIOS, а не обрабатывать прерывания клавиатуры самостоятельно, тогда INT 16h
это то, что вы хотите.
INT 16h
с AH=00h
или же 10h
заблокирует ожидание нажатия клавиши (возвращает результат ASCII в AL
); использование AH=01h
или же 11h
сначала запросить, доступно ли нажатие клавиши, если вы хотите избежать блокировки (немедленно возвращается с ZF
очистить, если ключ доступен, или установить, если нет). Смотрите, например, здесь или здесь (или Google "INT 16h" для более).
Вы можете обрабатывать IRQ 1 (сопоставленный с прерыванием 9 контроллером x86) и считывать ключи из порта 60h
,
См. http://inglorion.net/documents/tutorials/x86ostut/keyboard/.
Пример BIOS загрузочного сектора 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
Скомпилируйте и запустите:
as -o main.o main.S
ld --oformat binary -o main.img -Ttext 0x7C00 main.o
qemu-system-i386 -hda main.img
Затем, когда вы вводите символ, он выводится на экран.
Протестировано на Ubuntu 14.04 AMD64, Binutils 2.24, QEMU 2.0.0 и на реальном оборудовании Lenovo Thinkpad T400.