Linux ASM-16h模拟读取原始键盘扫描码

时间:2018-11-23 20:20:53

标签: linux assembly keyboard nasm scancodes

对于我的学习,我需要在asm上编写一个程序,该程序将等到按下键盘键后,再打印键字符的扫描码和ASCII码。

我知道BIOS的let synth = window.speechSynthesis; let inputTxt = document.getElementById('txt'); function speak() { let inputTxt = document.getElementById('txt'); let compiledStr = ""; inputTxt.childNodes.forEach(i => compiledStr += (i.nodeType === 3) ? i.textContent : i.value); if (synth.speaking) { console.error('speechSynthesis.speaking'); return; } let utterThis = new SpeechSynthesisUtterance(compiledStr); let selectedOption = voiceSelect.selectedOptions[0].getAttribute('data-name'); for (i = 0; i < voices.length; i++) { if (voices[i].name === selectedOption) { utterThis.voice = voices[i]; } } synth.speak(utterThis); }可以完成这项工作,但是我现在正在使用Linux,并且找不到合适的模拟系统调用。

该任务应使用什么?我目前正在使用Debian Stretch和NASM作为我的汇编代码。

1 个答案:

答案 0 :(得分:0)

通常,内核将键盘扫描码转换为可以在tty上读取的ASCII字符。但是有一些方法可以获取原始扫描代码,例如看看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(扫描码)或MEDIUMRAW(键码) 。然后,您可以进行常规的read系统调用。

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

显然,您可以使用x86-64上的syscall或32位x86上的int 0x80从手写的asm进行这些系统调用,在asm/unistd_64.h中查找系统调用号,然后各自标头中其他常量的值。


showkey会小心地设置看门狗计时器以干净退出,并捕获信号,因为这样做会在内核处理control-C或ctrl + alt之前 拦截键+ f2序列。因此,如果没有超时,将无法退出程序。而且,如果您退出后未恢复正常模式,则无法在控制台上键入命令来运行命令以恢复正常键盘模式。