在非规范模式下响应STDIN的单击键

时间:2016-09-20 07:39:31

标签: assembly posix system-calls gnome-terminal termios

此过程等待来自用户的单个击键并返回到调用者,在RAX中具有响应,或者更具体地是AL,在RDI中具有可选的提示字符串。主要是算法范围预期为0-9,菜单选择的A-Z允许说和Y或N作为输入。

  Ask:  enter   termios.size * 2, 0
        push    r15
        push    rbx
        or      edi, edi
        jz      $ + 7
        call    Show
        lea     rdi, [rbp-termios.size*2]
        mov     esi, TCGETS
        call    TermAttr
        push    rdi
        push    rsi

        mov     ecx, eax
        mov      cl, 6
        mov     rsi, rdi
        lea     rdi, [rbp-termios.size]
        mov     rbx, rdi
        rep     movsq

        and     byte [rbx+termios.c_lflag], ~(ICANON | ECHO | ISIG) 
        mov     word [rbx+termios.c_cc+VTIME], 0x100
        mov     rdi, rsi
        pop     rsi
        mov      si, TCSETSF
        push    rsi
        call    TermAttr

此时,控制台设置为非规范模式,等待来自用户的单个密钥库。

        xor     eax, eax
        mov     edi, eax
        mov     edx, eax
        inc      dl
        push    byte 0
        mov     rsi, rsp 
        syscall

RSP指向由push byte 0创建的空值填充的8字节缓冲区,在大多数情况下,此缓冲区只有一个字节的输入。我没有使用缓冲区刷新返回,而是希望RAX返回所有输入。例如, F12 将返回7E34321B

        pop     r15
        pop     rsi
        pop     rdi
        call    TermAttr         ; STDIN is flushed here
        pop     rbx
        mov     rax, r15
        pop     r15
        leave
        ret

根据我的理解,我有两个选择;

  • 轮询读取MIN = 0; VTIME = 0
  • 以interbyte超时读取MIN = 0; VTIME> 0

我认为民意调查是最可行的选择,但很难解释;

  

read(2)立即返回可用字节数或请求的字节数中的较小者。

如果没有数据可用,则read(2)返回0.

我的想法是正确的,如果按下F12,我会知道除了7FH之外的其他东西 - 在AL中被ESC按下了20H,下一次读取将返回3然后我可以做任何事情来阅读剩下的人物?

0 个答案:

没有答案