对于我的学习,我需要在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作为我的汇编代码。
答案 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序列。因此,如果没有超时,将无法退出程序。而且,如果您退出后未恢复正常模式,则无法在控制台上键入命令来运行命令以恢复正常键盘模式。