汇编 - 文件管理

❮ 上一页

下一页 ❯

汇编 - 文件管理

系统将任何输入或输出数据视为字节流。 标准的文件流有3种 −

标准输入(stdin),

标准输出 (stdout),以及

标准错误 (stderr)。

文件描述符

文件描述符是作为文件 ID 分配给文件的 16 位整数。 当创建新文件或打开现有文件时,文件描述符用于访问文件。

标准文件流的文件描述符 - stdin、stdout 和 stderr 分别为 0、1 和 2。

文件指针

文件指针以字节为单位指定文件中后续读/写操作的位置。 每个文件被视为一个字节序列。 每个打开的文件都与一个文件指针相关联,该文件指针指定相对于文件开头的偏移量(以字节为单位)。 打开文件时,文件指针设置为零。

文件处理系统调用

下表简要描述了与文件处理相关的系统调用 −

%eax

Name

%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 Tutorials Point"。 接下来,程序从文件中读取数据并将数据存储到名为 info 的缓冲区中。 最后,它显示存储在 info 中的文本。

section .text

global _start ;must be declared for using gcc

_start: ;tell linker entry point

;create the file

mov eax, 8

mov ebx, file_name

mov ecx, 0777 ;read, write and execute by all

int 0x80 ;call kernel

mov [fd_out], eax

; write into the file

mov edx,len ;number of bytes

mov ecx, msg ;message to write

mov ebx, [fd_out] ;file descriptor

mov eax,4 ;system call number (sys_write)

int 0x80 ;call kernel

; close the file

mov eax, 6

mov ebx, [fd_out]

; write the message indicating end of file write

mov eax, 4

mov ebx, 1

mov ecx, msg_done

mov edx, len_done

int 0x80

;open the file for reading

mov eax, 5

mov ebx, file_name

mov ecx, 0 ;for read only access

mov edx, 0777 ;read, write and execute by all

int 0x80

mov [fd_in], eax

;read from file

mov eax, 3

mov ebx, [fd_in]

mov ecx, info

mov edx, 26

int 0x80

; close the file

mov eax, 6

mov ebx, [fd_in]

int 0x80

; print the info

mov eax, 4

mov ebx, 1

mov ecx, info

mov edx, 26

int 0x80

mov eax,1 ;system call number (sys_exit)

int 0x80 ;call kernel

section .data

file_name db 'myfile.txt'

msg db 'Welcome to Tutorials Point'

len equ $-msg

msg_done db 'Written to file', 0xa

len_done equ $-msg_done

section .bss

fd_out resb 1

fd_in resb 1

info resb 26

当上面的代码被编译并执行时,会产生以下结果 −

Written to file

Welcome to Tutorials Point

❮ 上一页

下一页 ❯