【发布时间】: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 我的主要问题是我不知道如何从上次停止的地方继续阅读。我的意思是每次尝试读取下一行或字节时,它都会从头开始读取文件