如何'silently'从 Linux 上的终端获取用户输入?



我需要跳过其中的每一个辅音来获得用户输入。因此,每一个元音都应该而不是被打印出来(而不仅仅是在点击Enter后的某个过程中删除(。

我接到老师的汇编语言任务。目前我在Linux上使用NASM,并希望坚持使用它

问题是,我需要"过载"用户输入中断,在其中我应该能够处理输入(跳过每一秒的辅音(。我在网上搜索了一下,没有找到合适的答案。不知道如何在缓冲和打印之前"捕捉"用户输入,也不知道如何读取单个字符而不在终端中打印。

我希望看到一个替换(或修改(标准输入中断系统调用的例子。这将是理想的情况。

第二种选择是制作自己类型的"处理程序",一个接一个地获取每个字符,而不回显它,而不是自己处理Backspace和Enter之类的事情。就像Windows C中的getch()一样。(或0x16 BIOS中断(。

下面是一个我用来检索单个击键的示例。请记住,函数键、箭头和其他类似HOME、PGDN等返回的字节超过一个,因此我最多读取8个字节,这样输入缓冲区中剩下的就不会成为下一次写入的工件。这个片段被设计成一个对以下内容的响应系统:;

继续[是/否]

调用进程将读取AL中返回的字符。如果它是0x1b(27 dec/ESC(,则我们知道它是扩展键之一。例如,F1将在EAX中返回0x504f1b。

USE64
sys_read      equ      0
sys_write     equ      1
sys_ioctl     equ     16
%define      ICANON      2
%define        ECHO      8
%define      TCGETS      0x5401
%define      TCPUTS      0X5402
section    .text
; =============================================================================
; Accept a single key press from operator and return the result that may be
; up to 5 bytes in length.
;    LEAVE: RAX = Byte[s] returned by SYS_READ
; -----------------------------------------------------------------------------
%define   c_lflag     rdx + 12
%define      keys     rbp +  8
%define      MASK     ICANON | ECHO
STK_SIZE  equ 56              ; Room for 36 byte termios structure
QueryKey:
xor     eax, eax
push    rax             ; This is where result will be stored.
push    rbp
mov     rbp, rsp
sub     rsp, STK_SIZE
push    r11             ; Modified by SYSCALL
push    rbx
push    rdx
push    rcx
push    rdi
push    rsi             ; With size of 56, stack is now QWORD aligned
mov     edi, eax            ; Equivalent to setting EDI to STDIN
mov     esi, TCGETS
lea     rdx, [rbp-STK_SIZE] ; Points to TERMIOS buffer on stack
mov      al, sys_ioctl
syscall
lea     rbx, [c_lflag]
and     byte [rbx], ~(MASK)
inc     esi                 ; RSI = TCPUTS
push    rsi
mov      al, sys_ioctl
push    rax
syscall
; Wait for keypress from operator.
lea     rsi, [keys]         ; Set buffer for input
push    rdx
mov     edx, 8              ; Read QWORD bytes max
mov      al, sys_read
syscall
NOTE: The code you need could go here
pop     rdx                 ; Points back to TERMIOS
pop     rax
pop     rsi                 ; TCPUTS again
or      byte [rbx], MASK
syscall
pop     rsi
pop     rdi
pop     rcx
pop     rdx
pop     rbx
pop     r11
leave
pop        rax              ; Return up to 8 characters
ret

相关内容

  • 没有找到相关文章

最新更新