Россия и Беларусь начали и продолжают войну против народа Украины!

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

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

  Обновл. 16 Сен 2021  | 

 16495

 ǀ   1 

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

   стандартный ввод (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 и EDX;

   вызовите соответствующее прерывание (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 (18 оценок, среднее: 4,89 из 5)
Загрузка...

Комментариев: 1

  1. Просто Алёша:

    Надо добавить 0 к строке имени файла
    63: file_name db 'myfile.txt', 0

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

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