我在NASM(用于linux)中有这段代码,它应该打开现有文件,读取它并在屏幕上打印内容,但不起作用,有人能告诉我我做错了什么吗?({ {1}}是文件的名称)
hello.txt
答案 0 :(得分:3)
mov ebx, [file] ; name of the file
mov eax, 5
mov ecx, 0
int 80h
错了。松开file
周围的方括号。您正在传递文件名而不是指向文件名的指针。
mov ebx, file ; const char *filename
mov eax, 5
mov ecx, 0
int 80h
答案 1 :(得分:2)
我在这里看到了很多错误,按顺序排列:
mov ebx, [file] ; name of the file
mov eax, 5
mov ecx, 0
int 80h
在这里,如上所述,你必须丢失方括号(因为函数需要一个指针,而不是一个值)
mov eax, 3
mov ebx, eax
mov ecx, buffer
mov edx, len
int 80h
在这里,你必须从eax中保存文件描述符,然后写入值3,否则你只是松开它
mov eax, 4
mov ebx, 1
mov ecx, buffer
mov edx, len
int 80h
好。这里你使用ebx寄存器,所以更好的方法是将文件描述符保存在内存中。而对于显示,您从缓冲区获取1024个字节,这是不正确的。从文件读取后,eax寄存器将包含读取的字符数,因此从文件读取后,最好将ex寄存器中的值存储在edx中
mov eax, 6
int 80h
再次。你关闭文件,但ebx包含污垢,虽然它必须包含文件描述符
正确的代码必须如下所示:
section .data
file db "text.txt",0 ;filename ends with '\0' byte
section .bss
descriptor resb 4 ;memory for storing descriptor
buffer resb 1024
len equ 1024
section .start
global _start
_start:
mov eax,5 ;open
mov ebx,file ;filename
mov ecx,0 ;read only
int 80h ;open filename for read only
mov [descriptor],eax ;storing the descriptor
mov eax,3 ;read from file
mov ebx,[descriptor] ;your file descriptor
mov ecx,buffer ;read to buffer
mov edx,len ;read len bytes
int 80h ;read len bytes to buffer from file
mov edx,eax ;storing count of readed bytes to edx
mov eax,4 ;write to file
mov ebx,1 ;terminal
mov ecx,buffer ;from buffer
int 80h ;write to terminal all readed bytes from buffer
mov eax,6 ;close file
mov ebx,[descriptor] ;your file descriptor
int 80h ;close your file
mov eax,1
mov ebx,0
int 80h
这不是一个完美的代码,但应该可行