Ассемблер. Управление файлами

  Светлана Деменева  | 

  Обновл. 30 Дек 2019  | 

 2889

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

   Стандартный ввод (stdin)

   Стандартный вывод (stdout)

   Стандартная ошибка (stderr)

Файловый дескриптор

Файловый дескриптор (или ещё «дескриптор файла«) — это 16-разрядное целое число, присваиваемое файлу в качестве идентификатора. Когда создаётся новый файл или открывается существующий, дескриптор файла используется для доступа к нему.

Файловый дескриптор стандартных файловых потоков:

   stdin — 0;

   stdout — 1;

   stderr — 2.

Файловый указатель


Файловый указатель указывает местоположение для последующей операции чтения/записи в файл. Каждый файл рассматривается как последовательность байтов и ассоциируется с файловым указателем, который задает смещение в байтах относительно начала файла. Когда файл открыт, значением файлового указателя является 0.

Системные вызовы обработки файлов

В следующей таблице кратко описаны системные вызовы, связанные с обработкой файлов:

%eax Имя системного вызова %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 Ravesli! в этот файл. Затем программа считывает данные из файла и сохраняет их в буфере с именем info. Наконец, программа выводит текст, сохранённый в буфере info на экран.

Результат выполнения программы выше:

Written to file
Welcome to Ravesli!

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (8 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *