汇编语言 文件管理
-
文件管理
系统将任何输入或输出数据视为字节流。有三个标准文件流-- 标准输入(stdin)
- 标准输出(stdout)
- 标准错误(stderr)
-
文件描述符
文件描述符是分配给一个文件作为文件ID的16位整数。创建新文件或打开现有文件时,文件描述符用于访问文件。标准文件流的文件描述符-stdin,stdout和stderr分别为0、1和2 -
文件指针
文件指针指定以字节为单位的文件在随后的读/写操作的位置。每个文件都被视为字节序列。每个打开的文件都与一个文件指针相关联,该文件指针指定相对于文件开头的字节偏移量。打开文件时,文件指针设置为零。 -
文件处理系统调用
下表简要描述了与文件处理相关的系统调用-%eax 名称 %ebx %ecx %edx 2 sys_fork struct pt_regs - - 3 sys_read unsigned int char * size_t 4 sys_write unsigned int const char * size_t 5 sys_open const char * int int 6 sys_close unsigned int - - 8 sys_creat const char * int - 19 sys_lseek unsigned int off_t unsigned int 使用系统调用所需的步骤与我们之前讨论的相同-- 将系统调用号码放入EAX寄存器中。
- 将参数保存到系统调用中的寄存器EBX,ECX等中。
- 调用相关的中断(80h)。
- 结果通常在EAX寄存器中返回。
-
创建和打开文件
要创建和打开文件,请执行以下任务-- 将系统调用sys_creat()数字8放入EAX寄存器中。
- 将文件名放在EBX寄存器中。
- 将文件权限放入ECX寄存器。
系统调用在EAX寄存器中返回已创建文件的文件描述符,如果发生错误,则错误代码在EAX寄存器中。 -
打开一个现有文件
要打开现有文件,请执行以下任务-- 将系统调用sys_open()5放入EAX寄存器中。
- 将文件名放在EBX寄存器中。
- 将文件访问模式放入ECX寄存器。
- 将文件权限放入EDX寄存器中。
- 系统调用在EAX寄存器中返回已创建文件的文件描述符,如果发生错误,则错误代码在EAX寄存器中。
在文件访问模式中,最常用的是:只读(0),仅写(1)和读写(2)。 -
从文件读取
要从文件读取,请执行以下任务-- 将系统调用sys_read()3放入EAX寄存器中。
- 将文件描述符放入EBX寄存器。
- 将指针放到ECX寄存器中的输入缓冲区。
- 将缓冲区大小(即要读取的字节数)放入EDX寄存器中。
- 系统调用返回在EAX寄存器中读取的字节数,如果发生错误,则错误代码在EAX寄存器中。
-
写入文件
要写入文件,请执行以下任务-- 将系统调用sys_write()编号4放入EAX寄存器中。
- 将文件描述符放入EBX寄存器。
- 将指针放到ECX寄存器中的输出缓冲区。
- 将缓冲区大小(即要写入的字节数)放入EDX寄存器中。
- 系统调用返回写入EAX寄存器的实际字节数,如果发生错误,则错误代码位于EAX寄存器中。
-
关闭文件
要关闭文件,请执行以下任务-- 将系统调用sys_close()编号6放入EAX寄存器中。
- 将文件描述符放入EBX寄存器。
- 发生错误时,系统调用将返回EAX寄存器中的错误代码。
-
更新文件
要更新文件,请执行以下任务-- 将系统调用sys_lseek()编号19放入EAX寄存器中。
- 将文件描述符放入EBX寄存器。
- 将偏移值放入ECX寄存器中。
- 将偏移量的参考位置放入EDX寄存器中。
参考位置可以是:- 文件开头-值0
- 当前位置-值1
- 文件结尾-值2
发生错误时,系统调用将返回EAX寄存器中的错误代码。 -
例子
以下程序创建并打开一个名为myfile.txt的文件,并在该文件中写入文本“Welcome to Jc2182”。接下来,程序从文件读取并将数据存储到名为info的缓冲区中。最后,它将显示存储在info中的文本。编译并执行上述代码后,将产生以下结果-