NASM,读取文件并打印内容

时间:2014-11-17 00:47:14

标签: linux assembly nasm

我在NASM(用于linux)中有这段代码,它应该打开现有文件,读取它并在屏幕上打印内容,但不起作用,有人能告诉我我做错了什么吗?(​​{ {1}}是文件的名称)

hello.txt

2 个答案:

答案 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

这不是一个完美的代码,但应该可行