Assembly 重置字符串变量以在循环中打印多个用户输入(NASM程序集)

Assembly 重置字符串变量以在循环中打印多个用户输入(NASM程序集),assembly,nasm,Assembly,Nasm,我正在使用一个64位Linux系统,我正在尝试使用NASM来构建一个程序,该程序要求用户输入,然后打印出来。之后,用户可以选择再次执行相同操作,或退出 我的问题是,用于存储用户输入的变量“text”不会在每次执行结束时重置,因此会发生如下情况: 用户第一次输入文本:helloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

我正在使用一个64位Linux系统,我正在尝试使用NASM来构建一个程序,该程序要求用户输入,然后打印出来。之后,用户可以选择再次执行相同操作,或退出

我的问题是,用于存储用户输入的变量“text”不会在每次执行结束时重置,因此会发生如下情况:

  • 用户第一次输入文本:helloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

  • 输出:helloooooooooooooooooooooooooooooooooooooo

  • 用户第二次输入文本:轰

  • 输出:轰! 呜呜呜呜呜呜呜呜呜呜

第一次执行的部分“helloooo”出现了,我不知道如何防止这种情况发生

我非常感谢任何帮助,因为我才刚刚开始了解这一点

谢谢

这就是我所做的:

section .data
prompt db "Type your text here.", 0h

retry db "Wanna try again? If yes, enter y. If not, enter anything else to close the program", 0h

section .bss
text resb 255
choice resb 2

section .text
    global _start

_start:

    mov rax, 1      ;Just asking the user to enter input
    mov rdi, 1
    mov rsi, prompt
    mov rdx, 21
    syscall


    mov rax, 0      ;Getting input and saving it on var text
    mov rdi, 0
    mov rsi, text
    mov rdx, 255
    syscall

    mov rax, 1      ;Printing the user input
    mov rdi, 1
    mov rsi, text
    mov rdx, 255
    syscall

    mov rax, 1      ;Asking if user wants to try again
    mov rdi, 1
    mov rsi, retry
    mov rdx, 83
    syscall

    mov rax, 0      ;Getting input and saving it on var choice
    mov rdi, 0
    mov rsi, choice
    mov rdx, 2
    syscall

    mov r8b, [choice] ;If choice is different from y, go to end and close the program. Otherwhise, go back to start.
    cmp byte r8b, 'y'
    jne end
    jmp _start

    end:
    mov rax, 60      
    mov rdi, 0       
    syscall
无论输入了多少个字符,您总是要写255个字符。如果用户输入少于255,您将写入
文本
缓冲区中的任何其他内容,可能是上一次迭代留下的数据

当您发出
read
系统调用(即
syscall
rax=0
)时,它将在
rax
中返回一个值,指示读取的字符数(或文件末尾为0,或错误时为负数)。只有许多字符被写入缓冲区;其余部分不变

不必“重置”缓冲区的剩余内容,即使在其上写入零或其他内容,也只会导致输出一堆不需要的零字节——事实上,您已经这样做了。您可能在终端上看不到它们,但如果您将输出重定向到文件,它们就会在那里


因此,您应该将
read
返回的值(如果是正值)在
rdx
中传递给
write
(syscall with
rax=1
),而不是始终使用255。然后,您将只写入已读取的内容,而缓冲区的剩余内容与此无关,因为它们不会被使用。

这正是我所需要的。非常感谢!
    mov rax, 1      ;Printing the user input
    mov rdi, 1
    mov rsi, text
    mov rdx, 255
    syscall