【问题标题】:Reading text file line by line NASM逐行读取文本文件 NASM
【发布时间】:2015-04-30 20:14:37
【问题描述】:

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

顺便说一句,这是我正在尝试使用的代码:

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

【问题讨论】:

  • 简单的方法,但是很慢,一次读取一个字节。更好的是,一次读取 BUFSIZ 并处理它,直到完成。我喜欢BUFSIZ equ 10000h - 老dos-head 认为64k 是一个不错的整数。尝试一个较小的值以确保您正确处理缓冲区结束。当read 返回零时,您就完成了。最好的(?),但对于初学者来说可能很复杂,mmap 文件。
  • @FrankKotler 我的主要问题是我不知道如何从上次停止的地方继续阅读。我的意思是每次尝试读取下一行或字节时,它都会从头开始读取文件

标签: file assembly text nasm


【解决方案1】:

使用 mmap 系统调用,将整个文件读入内存并搜索 0x0A 序列。这是行尾的 ASCII 码。检查 0x0D 可能也很有用(如果您正在处理 Windows 文本文件。序列 0x0A,0x0D 表示新行,因此表示行尾。 mmap 将尝试为您分配内存,而不会为您带来管理开销。否则,使用系统调用 sbrk 确定文件长度并保留内存。也可以,但是您必须进行更多编程。我的建议是 mmap 是最好的方法。

【讨论】:

  • 虽然我同意使用 mmap 分配内存,但随意将整个文件读入 RAM 并不是一个好主意。这创建了一个非常脆弱的解决方案。当有人使用该代码打开一个 400 GB 的文件时会发生什么?
  • stackoverflow.com/questions/7222164/mmap-an-entire-large-file 也许这个链接可以帮助你进一步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多