Сборка - Управление файлами
Система рассматривает любые входные или выходные данные как поток байтов. Есть три стандартных файловых потока -
- Стандартный ввод (stdin),
- Стандартный вывод (stdout) и
- Стандартная ошибка (stderr).
Дескриптор файла
А file descriptorпредставляет собой 16-разрядное целое число, присвоенное файлу в качестве идентификатора файла. Когда создается новый файл или открывается существующий, дескриптор файла используется для доступа к файлу.
Файловый дескриптор стандартных файловых потоков - stdin, stdout и stderr равны 0, 1 и 2 соответственно.
Указатель файла
А file pointerуказывает местоположение для последующей операции чтения / записи в файле в байтах. Каждый файл рассматривается как последовательность байтов. Каждый открытый файл связан с указателем файла, который указывает смещение в байтах относительно начала файла. Когда файл открывается, указатель файла устанавливается в ноль.
Системные вызовы обработки файлов
В следующей таблице кратко описаны системные вызовы, связанные с обработкой файлов.
% eax | имя | % ebx | % ecx | % edx |
---|---|---|---|---|
2 | sys_fork | struct pt_regs | - | - |
3 | sys_read | беззнаковое целое | символ * | size_t |
4 | sys_write | беззнаковое целое | const char * | size_t |
5 | sys_open | const char * | int | int |
6 | sys_close | беззнаковое целое | - | - |
8 | sys_creat | const char * | int | - |
19 | sys_lseek | беззнаковое целое | off_t | беззнаковое целое |
Шаги, необходимые для использования системных вызовов, такие же, как мы обсуждали ранее -
- Поместите номер системного вызова в регистр 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 и записывает в него текст «Добро пожаловать в учебные пособия». Затем программа читает из файла и сохраняет данные в буфер с именем 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