使用宏接受来自用户的输入

时间:2016-04-07 20:15:50

标签: assembly nasm x86-64

我试图在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?

1 个答案:

答案 0 :(得分:2)

你的意思是16个字节,而不是位。

你正在制作一个宏来呼叫read(2)。有关其功能的详细信息,请参见手册页。它只是从文件描述符中读取字节。如果文件描述符在具有正常终端设置的规范模式(非原始模式)下是tty,则它将是行缓冲的。即系统调用将阻塞直到换行符或EOF(ctrl-d)。或者直到某些事情提前中断它,使其返回-EINTR,因为你直接调用它而不是使用glibc包装函数来重试中断的系统调用。

请参阅stty(1)termios(3),了解相应tty ioctls之上的常用标准库包装器。 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)将在一个换行符后返回,除非系统负载过重,以至于在输入第二个换行符之前,您的进程不会被唤醒。 (例如作为大糊状物的一部分。)