此过程等待来自用户的单个击键并返回到调用者,在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
根据我的理解,我有两个选择;
我认为民意调查是最可行的选择,但很难解释;
read(2)立即返回可用字节数或请求的字节数中的较小者。
如果没有数据可用,则read(2)返回0.
我的想法是正确的,如果按下F12
,我会知道除了7FH之外的其他东西 - 在AL中被ESC按下了20H,下一次读取将返回3然后我可以做任何事情来阅读剩下的人物?