我试图在x68-64 nasm代码中接受来自用户的输入。 如果我接受16个字节(例如0000000000000001)应该为变量保留多少内存?
SECTION .bss
number resb 16 ;16 or 17(16+enter key)?
%macro read 2 ;is it correct SECTION for defining macro?
mov rax,00h
mov rdi,00h ;unsigned int fd. what is correct value for fd?
mov rsi,%1
mov rdi,%2
syscall
%endmacro
SECTION .text
read number,16 ;16 should be passed as length or 17 considering enter key?
答案 0 :(得分:2)
你的意思是16个字节,而不是位。
你正在制作一个宏来呼叫read(2)
。有关其功能的详细信息,请参见手册页。它只是从文件描述符中读取字节。如果文件描述符在具有正常终端设置的规范模式(非原始模式)下是tty,则它将是行缓冲的。即系统调用将阻塞直到换行符或EOF(ctrl-d)。或者直到某些事情提前中断它,使其返回-EINTR
,因为你直接调用它而不是使用glibc包装函数来重试中断的系统调用。
请参阅stty(1)
和termios(3)
,了解相应tty ioctl
s之上的常用标准库包装器。 TL:DR :获得除熟食之外的任何东西都非常复杂。所以你没有看到“输入密钥”,你只看到换行符。
重要的是要注意,如果传入的缓冲区超过传递给read(2)
的缓冲区,则只需读取足够的字节来填充缓冲区,其余的仍处于待处理状态。它们不会被丢弃,因此另一个read
调用将获得它们,而不是下一行的开头。
stdin在POSIX中总是文件描述符为零,因此rdi=0
是正确的。
第3个arg(大小)进入rdx
。您将其放入rdi
,这可能会使read(2)
来电回复-EBADF
,因为您的流程不太可能在fd 16上打开任何内容。
在strace
下运行您的程序,看看会发生什么。 (strace ./a.out
)强>
使缓冲区与您希望程序一次接受的最长行一样大。在交互式tty上,read(2)
将在一个换行符后返回,除非系统负载过重,以至于在输入第二个换行符之前,您的进程不会被唤醒。 (例如作为大糊状物的一部分。)