我在尝试打开文件并从中读取时遇到问题。系统将提示用户输入文件名。
程序编译时没有错误,但没有显示任何内容。当我在.data
部分对文件名进行硬编码时,它运行正常,但是当我从用户那里获得文件名时,它无法读取文件。我哪里做错了?我找不到任何错误。
使用硬编码名称输出:welcome
用户输入名称时的输出:���
这是我的代码:
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
答案 0 :(得分:0)
您似乎正在尝试阅读STDERR
:
mov eax,3
mov ebx,2
mov ecx,file_name ;(NOTE:tried using 'dword[file_name]',doesnt work)
mov edx,20
如果您想阅读mov ebx,2
,那么mov ebx,0
应为STDIN
。
还想知道在打开文件之前如何检查该文件是否存在
如果在没有设置sys_open
标志的情况下使用O_CREAT
,它将失败并返回-1(如果该文件尚不存在)。如果您愿意,也可以使用access
(syscall 33)或stat
(syscall 18)。
答案 1 :(得分:0)
添加迈克尔所说的内容...... 1)fd_in
太小了 - 让它成为resd 1
。 2)sys_read
不返回以零结尾的字符串,sys_open
需要一个字符串。
mov byte [ecx + eax - 1], 0
mov byte [ecx + eax - 1], 0
在文件名的之后应该将其终止。