Linux NASM - 在没有提示的情况下耗尽终端输入

时间:2021-01-24 21:10:55

标签: linux assembly terminal nasm

我想在提示用户之前耗尽终端输入,或者在我想提示用户输入之前关闭终端输入。

我正在编写一个程序,它使用 sys_read 提示用户通过终端进行输入。如果用户在被提示之前键入字符,这些字符将包含在输入中。我可以在提示后再次使用 sys_read 轻松耗尽每个未读字符,但它依赖于输入流末尾的返回字符以防止多次提示用户(我假设用户每结束一次用回车键提示)。我不能依赖提示前的返回字符的存在,所以我不能以同样的方式排出输入。

我也试过用 sys_close 关闭标准输入,但我不知道如何再次打开终端输入,所以当出现提示时程序被冻结。即使我可以再次打开终端输入,我也不确定在关闭时输入的字符是否仍会在下次读取时保存,这会使这种方法完全无用。

如果有某种模糊的 termios 标志可以禁用用户输入,那也是一个很好的解决方案。

这是一个程序,例如:

   global _start

_start:
   
   mov edx,ldot
   mov ecx,mdot
   mov ebx,1
   mov eax,4    ; sys_write
   int 0x80
   
   mov dword[sleep_sec],1
   mov dword[sleep_usec],0
   mov ecx,0
   mov ebx,sleep
   mov eax,162  ; sys_nanosleep
   int 0x80
   
   mov edx,ldesire
   mov ecx,mdesire
   mov ebx,1
   mov eax,4    ; sys_write
   int 0x80
   
   call input   ;  here's the call...
   
   mov edx,lreceive
   mov ecx,mreceive
   mov ebx,1
   mov eax,4    ; sys_write
   int 0x80
   
   mov dword[sleep_sec],1
   mov dword[sleep_usec],0
   mov ecx,0
   mov ebx,sleep
   mov eax,162  ; sys_nanosleep
   int 0x80
   
   mov edx,99
   mov ecx,inputed
   mov ebx,1
   mov eax,4    ; sys_write
   int 0x80
   
   mov eax,1    ; sys_exit
   int 0x80     ; the end!



input:          ;   here is all that I am concerned about
   mov edx,99
   mov ecx,inputed
   mov ebx,0    ; stdin
   mov eax,3    ; sys_read
   int 0x80
   
   cmp eax,99   ; check for valid input
   jl inputdone
   cmp byte[inputed+98],0xa
   je inputdone
   
   inputclear:  ; drain
      mov eax,3
      int 0x80
      cmp eax,99
      jl inputerror
      cmp byte[inputed+98],0xa
      je inputerror
      jmp inputclear
   
   inputerror:
      mov eax,-1
      ret
   inputdone:
      mov eax,1
      ret



section .bss   
inputed resb 99

section .data

sleep:
   sleep_sec  dd 0
   sleep_usec dd 0

mdot db '...',0xA
ldot equ $ - mdot

mdesire db 'tell me your truest desire:'
ldesire equ $ - mdesire

mreceive db 'you shall receive... '
lreceive equ $ - mreceive

听命于做事的用户不会有任何问题:

...
tell me your truest desire:money
you shall receive... money

但是喜欢按自己喜欢的按钮的用户会很挣扎:

...
a gtell me your truest desire:love
you shall receive... a glove

而且程序不会等待任何弄乱返回键的人:

...
who
tell me your truest desire:you shall receive... who

0 个答案:

没有答案