Linux 用户提供文件名时无法读取文件(使用nasm的x86汇编程序)

Linux 用户提供文件名时无法读取文件(使用nasm的x86汇编程序),linux,file,assembly,x86,nasm,Linux,File,Assembly,X86,Nasm,我在尝试打开文件并从中读取时遇到问题。系统将提示用户输入文件名 程序编译时没有错误,但没有显示任何内容。当我在.data部分硬编码文件名时,它运行正常,但当我从用户处获取文件名时,它无法读取文件。我哪里做错了?我找不到任何错误 使用硬编码名称输出:欢迎 用户输入名称时的输出:��� 这是我的密码: section .data promptUsr db 'enter a file name:',0xA,0xD lenPrompt equ $-promptUsr info d

我在尝试打开文件并从中读取时遇到问题。系统将提示用户输入文件名

程序编译时没有错误,但没有显示任何内容。当我在
.data
部分硬编码文件名时,它运行正常,但当我从用户处获取文件名时,它无法读取文件。我哪里做错了?我找不到任何错误

使用硬编码名称输出:
欢迎

用户输入名称时的输出:
���

这是我的密码:

section .data promptUsr db 'enter a file name:',0xA,0xD lenPrompt equ $-promptUsr info db 1 ;file_name db 'data.txt' (NOTE:harcoded name works when used) section .bss fd_in resb 1 buffer resb 7 file_name resb 20 section .text global _start _start: ;prompt user to enter a file name mov eax,4 ;sys_write mov ebx,1 ;stdout mov ecx,promptUsr mov edx,lenPrompt int 0x80 ;read filename (NOTE:when user enters the same name 'data.txt',this is the output:���) mov eax,3 mov ebx,2 mov ecx,file_name ;(NOTE:tried using 'dword[file_name]',doesnt work) mov edx,20 int 0x80 ;open file mov eax,5 mov ebx,file_name ;(NOTE:also tried using 'dword[file_name]',doesnt work too) mov ecx,2 ;read n write mov edx,7777h ;all file permissions int 0x80 mov [fd_in],eax ;read 7 bytes of the file mov eax,3 mov ebx,[fd_in] mov ecx,buffer mov edx,7 int 0x80 ;close the file mov eax,6 int 0x80 ;print out what was read mov eax,4 mov ebx,1 mov ecx,buffer mov edx,7 int 0x80 ;end program mov eax,1 int 0x80 第二节数据 promptUsr db“输入文件名:”,0xA,0xD lenPrompt eq$-promptUsr 信息数据库1 ;文件名db'data.txt'(注意:使用harcoded名称时有效) 第2节bss resb 1中的fd_ 缓冲区resb 7 文件名resb 20 第节.案文 全球启动 _开始: ;提示用户输入文件名 mov-eax,4;系统写入 mov-ebx,1;stdout mov ecx,promptUsr mov-edx,lenPrompt int 0x80 ;读取文件名(注意:当用户输入相同的名称“data.txt”时,这是输出:���) mov-eax,3 mov-ebx,2 mov ecx,文件名;(注意:尝试使用“dword[文件名]”,无效) mov edx,20 int 0x80 ;打开文件 mov-eax,5 mov ebx,文件名;(注意:也尝试使用“dword[file\u name]”,但不起作用) mov ecx,2;读写 mov edx,7777h;所有文件权限 int 0x80 mov[fd_in],eax ;读取文件的7个字节 mov-eax,3 mov ebx,[fd_in] 缓冲区 mov edx,7 int 0x80 ;关闭文件 mov-eax,6 int 0x80 ;打印所读内容 mov-eax,4 mov-ebx,1 缓冲区 mov edx,7 int 0x80 ;结束程序 mov-eax,1 int 0x80
看起来您正在尝试从
STDERR
读取:

mov eax,3   
mov ebx,2   
mov ecx,file_name   ;(NOTE:tried using 'dword[file_name]',doesnt work)
mov edx,20
如果要从
STDIN
读取,则
mov ebx,2
应该是
mov ebx,0



还想知道如何在打开文件之前先检查文件是否存在


如果您使用的
sys\u open
没有设置
O\u create
标志,则该文件将失败并返回-1(如果文件不存在)。如果您愿意,也可以使用()或()。

添加到Michael所说的内容中…1)
中的
fd\u太小-将其设置为
resd 1
。2)
sys\u read
不返回以零结尾的字符串,
sys\u open
需要一个字符串

mov byte [ecx + eax - 1], 0

在文件名的
sys\u read
为零后,终止文件名。

还想知道如何在打开文件之前先检查文件是否存在。thanx anyonethanx michael可快速回复。。。。我已将mov ebx,2更改为mov ebx,0,但仍然无法读取该文件..只有在代码中声明名称时才能读取该文件。我认为可能在插入某些隐藏字符(终止字符)时使用std_或者文件名末尾的某个内容?在使用该名称打开文件之前,是否应该去掉此不可见字符?如果是这样,你知道如何从字符串中删除最后一个字符吗?当我添加代码打印出用户输入的内容时,它会显示得很好,即“data.txt”有什么想法吗?thanx frank.刚刚尝试过,但无法正确读取,我应该在哪里插入mov字节[ecx+eax-1],0 c0de?仅在“mov ebx,0”之后插入它不起作用。在mov ecx之后插入,文件名也不起作用…代码运行,但没有显示任何内容。请注意,当我将resd 1更改为resb1时,输出以下wierd符号,这是输出:��� 当我将其设为resb 2时,输出为:�� resb 3输出为:� 将其返回到resd 1,不显示任何内容。这里有什么问题?那么,当我硬编码文件名时,为什么程序运行良好,而我只为文件描述符保留了一个字节呢?将零终止行放在
int 80h
之后
ecx
仍然是您的缓冲区,
eax
是读取的长度,包括终止换行符。你是对的,那里有一个隐藏的角色。我们想用另一个隐藏字符覆盖它,
sys\u open
希望出现的零。噢,我的!!最后非常感谢。它现在可以正常工作了。你是个救世主。这段代码从早上开始就让我头疼。有趣的是,在int 80h之后添加了终止0。我想int 80h之后文件名已经保存了。现在剩下的就是一种检查文件是否存在的方法,如果文件不存在,就会显示一条消息并退出程序。我是汇编n的新手,不知道syscall 33或18R是如何使用的。在mov[fd_in],eax之前使用:cmp eax,0 jbe end怎么样?试试看
man2 access
-它是C语言的,但你可以理解。或者,您可以按照您的建议,在系统打开后检查
eax
中的值,如果没有成功,请查看原因。(错误号h)