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

问题描述

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

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

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

  • 输出:Helloooooooooooooooooooooooooooooooooo

  • 用户第二次输入文本:Boom!

  • 输出:轰! oooooooooooooooooooooooooooooo

第一次执行时,“ Helloooooo”的一部分正在显示,我不知道如何防止这种情况发生。

我将不胜感激,因为我刚刚开始对此有所了解。

谢谢

这就是我所做的:

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      ;Asking if user wants to try again
    mov rdi,retry
    mov rdx,83
    syscall

    mov rax,0      ;Getting input and saving it on var choice
    mov rdi,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

解决方法

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

无论输入多少,您始终要写255个字符。如果用户输入的数据少于255,则您将在text缓冲区中写其他任何内容,可能是前一次迭代剩余的数据。

当您发出read系统调用(即syscallrax=0)时,它将在rax中返回一个值,该值指示读取的字符数(或0表示文件结尾,或错误时为负数)。缓冲区中只写入了许多字符。其余的保持不变。

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

因此,您应该将read的返回值(如果为正数)传递给rdxwrite进行系统调用),而不要始终使用255。只会写入已读取的内容,缓冲区的其余内容无关紧要,因为它们将不被使用。