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

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

  • Стандартный ввод (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