Как обрабатывать клавиатуру в реальном режиме через прерывания BIOS? - PullRequest
6 голосов
/ 06 ноября 2010

Мне нужно написать код для операционной системы, в которой я могу запустить вычислитель. Это похоже на настольный вычислитель.Для этого я читаю серию разработки brokenthorn Я прошел второй этап загрузчика Загрузчик находится в реальном режимеПосле этого автор объясняет защищенный режим.Я не хочу использовать защищенный режим.У меня нет времени на это.Поэтому я хочу написать вычислитель в реальном режиме, используя прерывания BIOS.Является ли это возможным?Я думаю, что это может быть написано на втором этапе загрузчика (я не уверен.) Означает, что мне не нужно использовать ядро ​​(я не уверен).Я не знаю, как использовать прерывания BIOS для обработки клавиатуры.Кто-нибудь может дать мне ссылку, которая поможет мне в этом?И если что-то не так в том, что я предположил выше, неправильно, пожалуйста, исправьте меня. Заранее спасибо.

Ответы [ 3 ]

9 голосов
/ 06 ноября 2010

Если вы хотите использовать высокоуровневые службы клавиатуры BIOS, а не обрабатывать прерывания клавиатуры самостоятельно, тогда INT 16h - это то, что вам нужно.

INT 16h с AH=00h или 10h заблокирует ожидание нажатия клавиши (возвращает результат ASCII в AL); используйте AH=01h или 11h, чтобы запросить, доступно ли нажатие клавиши первым, если вы хотите избежать блокировки (немедленно возвращает с ZF, очистить, если ключ доступен, или установить, если нет). Смотрите, например здесь или здесь (или Google "INT 16h" для более).

4 голосов
/ 06 ноября 2010

Вы можете обрабатывать IRQ 1 (сопоставленный с прерыванием 9 контроллером x86) и считывать ключи из порта 60h.

См. http://inglorion.net/documents/tutorials/x86ostut/keyboard/.

2 голосов

Пример BIOS минимального загрузочного сектора GAS

Когда вы вводите символ, он выводится на экран.

main.S

.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

GitHub upstream .

Протестировано на Ubuntu 14.04 AMD64, Binutils 2.24, QEMU 2.0.0 и на реальном оборудовании Lenovo Thinkpad T400.

...