逐行读取文本文件NASM

时间:2014-11-15 16:24:44

标签: file assembly text nasm

我是程序集编程的新手,我有一个任务,我必须逐行读取文本文件并使用文件中写入的内容并将其传递给另一个函数。我的问题是我不知道如何以这种方式阅读文本,因为我发现首先要读取文本文件,我必须创建一个缓冲区,保留一定数量的字节来存储文件中的内容。在这种情况下,我希望逐行读取(如循环),直到文件结束,所以我不知道我必须保留多少字节。感谢。

这是我正在尝试使用的代码:

SECTION .data

file_name db 'instruct.txt',0

SECTION .bss

fd_out resb 1
fd_in  resb 1
info resb  20

SECTION .text

global main        

main:   ;tell linker entry point
push ebp
mov ebp, esp
push ebx
;open the file for reading
mov eax, 5
mov ebx, file_name
mov ecx, 2       
mov edx, 0777       ;read, write and execute by all
int  0x80
mov  [fd_in], eax
loop:  
;read from file
mov eax, 3
mov ebx, [fd_in]
mov ecx, info
mov edx, 5
int 0x80
cmp eax, 0
  ;check EOF  
je exit
; print the info 
mov eax, 4
mov ebx, 1
mov ecx, info
mov edx, 5
int 0x80
; 
jmp loop 
mov eax,1  ;system call number (sys_exit)
int 0x80   ;call kernel
exit:
; close the file
mov eax, 6
mov ebx, [fd_in]
pop ebx
mov esp, ebp
pop ebp
ret

1 个答案:

答案 0 :(得分:0)

使用mmap syscall,将整个文件读入内存并搜索0x0A序列。这是行尾的ASCII代码。也许对于检查0x0D也是有用的(如果你正在处理windows文件文件。序列0x0A,0x0D表示一个新行,因此是行尾。 mmap将尝试为您分配内存,而无需为您管理开销。否则使用syscall sbrk确定文件长度并保留内存。也工作,但你必须编程更多。我的建议是mmap是最好的方式。