问题描述
我正在使用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
系统调用(即syscall
和rax=0
)时,它将在rax
中返回一个值,该值指示读取的字符数(或0表示文件结尾,或错误时为负数)。缓冲区中只写入了许多字符。其余的保持不变。
没有必要“重置”缓冲区的剩余内容,即使您在其上写入零,也只会导致输出一堆不需要的零字节-实际上您已经这样做了。您可能不会在终端上看到它们,但是如果将输出重定向到文件,它们将在那里。
因此,您应该将read
的返回值(如果为正数)传递给rdx
(write
进行系统调用),而不要始终使用255。只会写入已读取的内容,缓冲区的其余内容无关紧要,因为它们将不被使用。