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)