【发布时间】:2019-11-09 13:47:20
【问题描述】:
我需要让用户输入跳过其中的每个辅音。所以每个第二个辅音应该不被打印出来(不仅仅是在某些过程中按Enter键后删除)。
我的老师给了我一个汇编语言的任务。目前我在 Linux 上使用 NASM 并希望坚持下去。
问题是我需要“重载”用户输入中断,并且在其中我应该能够处理该输入(跳过每个辅音)。我已经搜索了网络并没有找到任何合适的答案。不是如何在缓冲和打印出来之前“捕获”用户输入,也不是在终端中不打印就读取单个字符的方法。
我想看一个替换(或修改)标准输入中断系统调用的示例。那将是理想的情况。
第二种选择是让您自己的“处理程序”类型一个接一个地获取每个字符而不回显它,而不是自己处理诸如 Backspace 和 Enter 之类的事情。就像 Windows C 中的 getch() 一样。 (或 0x16 BIOS 中断)。
【问题讨论】:
-
将this code 翻译成汇编。
-
您确定您正确解释了作业吗?您可能应该读取输入,然后打印它的过滤副本。如果您从 tty 读取,您想要的需要其他 POSIX TTY 系统调用将终端设置为无回显甚至原始模式。例如
./my_program < input_file也可以。 -
不,它应该像这样工作:用户:Presses R 终端:R 用户:Presses f 终端:R 用户:Presses z 终端:Rz 等等……
-
@Jester 我会努力的,谢谢
-
请注意,没有可以挂钩或修改的“中断”或“处理程序”。 UNIX(和 Linux)不能以这种方式工作。相反,正如 Jester 所说,您需要重新配置终端子系统 termios 以不回显用户键入的文本。除了 Jester 链接的答案之外,我建议您仔细阅读 Linux 手册页
man 3 termios和man 4 tty_ioctl,其中解释了 termios 子系统的工作原理以及如何在没有 libc 的情况下对其进行配置。请记住,这是在汇编中执行的一项高级任务,您需要通过查看标题手动构建正确的结构。
标签: linux assembly input nasm tty