Учебники

Сборка — Управление файлами

Система рассматривает любые входные или выходные данные как поток байтов. Есть три стандартных файловых потока —

  • Стандартный ввод (стандартный),
  • Стандартный вывод (стандартный вывод) и
  • Стандартная ошибка (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

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —