Система рассматривает любые входные или выходные данные как поток байтов. Есть три стандартных файловых потока —
- Стандартный ввод (стандартный),
- Стандартный вывод (стандартный вывод) и
- Стандартная ошибка (stderr).
Дескриптор файла
Дескриптор файла — это 16-разрядное целое число, назначаемое файлу в качестве идентификатора файла. Когда создается новый файл или открывается существующий файл, дескриптор файла используется для доступа к файлу.
Файловый дескриптор стандартных файловых потоков — stdin, stdout и stderr — 0, 1 и 2 соответственно.
Файловый указатель
Указатель файла указывает местоположение для последующей операции чтения / записи в файле в виде байтов. Каждый файл рассматривается как последовательность байтов. Каждый открытый файл связан с указателем файла, который задает смещение в байтах относительно начала файла. Когда файл открывается, указатель файла устанавливается на ноль.
Системные вызовы для работы с файлами
В следующей таблице кратко описаны системные вызовы, связанные с обработкой файлов.
% е | название | % EBX | % ECX | % EDX |
---|---|---|---|---|
2 | sys_fork | struct pt_regs | — | — |
3 | sys_read | без знака int | символ * | size_t |
4 | sys_write | без знака int | const char * | size_t |
5 | sys_open | const char * | ИНТ | ИНТ |
6 | sys_close | без знака int | — | — |
8 | sys_creat | const char * | ИНТ | — |
19 | sys_lseek | без знака int | off_t | без знака int |
Шаги, необходимые для использования системных вызовов, такие же, как мы обсуждали ранее —
- Поместите номер системного вызова в регистр EAX.
- Сохраните аргументы системного вызова в регистрах EBX, ECX и т. Д.
- Вызовите соответствующее прерывание (80ч).
- Результат обычно возвращается в регистр 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.
Поместите системный вызов sys_read () номер 3 в регистр EAX.
Поместите дескриптор файла в регистр EBX.
Поместите указатель на входной буфер в регистр ECX.
Поместите размер буфера, т. Е. Количество байтов для чтения, в регистр EDX.
Системный вызов возвращает количество байтов, прочитанных в регистре EAX, в случае ошибки код ошибки находится в регистре EAX.
Запись в файл
Для записи в файл выполните следующие задачи:
-
Поместите системный вызов sys_write () номер 4 в регистр EAX.
-
Поместите дескриптор файла в регистр EBX.
-
Поместите указатель на выходной буфер в регистр ECX.
-
Поместите размер буфера, т. Е. Количество байтов для записи, в регистр EDX.
Поместите системный вызов 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 . Наконец, он отображает текст как сохраненный в информации .
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
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —