Linux asm - int 16h аналог для чтения необработанных кодов сканирования клавиатуры - PullRequest
0 голосов
/ 23 ноября 2018

Для учебы мне нужно написать программу на asm, которая будет ждать, пока нажата клавиша на клавиатуре, а затем распечатывает ее код сканирования и ASCII-код символа клавиши.

Я знаю, что BIOSint 16h может выполнить эту работу, но я сейчас использую Linux и не могу найти для нее подходящий аналоговый системный вызов.

Что мне использовать для этой задачи?В настоящее время я использую Debian Stretch и NASM для моего кода сборки.

1 Ответ

0 голосов
/ 23 ноября 2018

Обычно ядро ​​переводит коды сканирования клавиатуры в символы ASCII, которые вы можете прочитать на tty.Но есть способы получить необработанные коды сканирования, например, посмотреть, как showkey(1) делает это (http://kbd -project.org / ) на текстовой консоли.https://wiki.archlinux.org/index.php/Keyboard_input

https://github.com/legionus/kbd/blob/2.0.4/src/showkey.c показывает, что вы можете использовать ioctl(2) в дескрипторе файла для консольного терминала , чтобы установить для режима перевода KBD значение RAW (коды сканирования) илиСРЕДНЯЯ (ключевые коды).Затем вы можете делать обычные read системные вызовы.

ioctl(fd, KDSKBMODE, show_keycodes ? K_MEDIUMRAW : K_RAW)

Очевидно, что вы можете выполнять эти системные вызовы из рукописного asm, используя syscall на x86-64 или int 0x80 на 32-битной x86,поиск номеров системных вызовов в asm/unistd_64.h и значений других констант в соответствующих заголовках.


showkey заботится о настройке сторожевого таймера для чистого выхода и перехватасигналы, потому что при этом перехватывает ключи до , ядро ​​обрабатывает последовательности control-C или ctrl + alt + f2 .Поэтому без тайм-аута не было бы возможности выйти из программы.И если вы вышли без восстановления нормального режима, на консоли не было бы возможности набрать команду для восстановления нормального режима клавиатуры.

...