Подготовка №5. Работа с файлами
Открыто с: понедельник, 23 сентября 2024, 00:00
Требуемые условия завершения
Ознакомьтесь с системными вызовами, отвечающими за работу с файлами, по таблице из книги Таненбаума (стр. 753): _OPEN/_CREATE/_CLOSE, _READ/_WRITE. Полезно также разобрать пример на стр. 784 книги Таненбаума.
Обратите внимание на константы, описанные в файле syscalnr.h
_READ = 3
_WRITE = 4
_OPEN = 5
_CLOSE = 6
_CREAT = 8
_LSEEK = 19
_GETCHAR = 117 ! five system subroutine numbers
_SPRINTF = 121
_PUTCHAR = 122
_SSCANF = 125
_PRINTF = 127
STDIN = 0 ! three initially opened file descriptors
STDOUT = 1
STDERR = 2
Задачи
- [task1.s, создание бинарного файла] Напишите программу, которая создаёт бинарный файл task1.dat с целыми числами от 1 до 10. Алгоритм:
- создать файл с помощью _CREATE: в качестве параметров указать имя файла и число 0600 для задания прав доступа (смысл этого числа поясняется в разделе "Просмотр и интерпретация прав доступа к файлам" cправочных материалов по ОС UNIX);
- получить дескриптор fd созданного файла (возвращается после _CREATE в регистре AX); Пример программы создания файла смотрите ниже.
- в цикле двухбайтовая переменная-буфер получает очередное значение (1, 2, …), системный вызов _WRITE записывает эти два байта в файл по дескриптору fd; помните, что системные вызовы обычно используют регистр AX для возвращаемого значения, потому хранить нужные программисту данные следует в других регистрах, либо сбрасывать в стек;
- закрыть файл с помощью системного вызова _CLOSE (в следующих задачах напоминаний об этом важном действии не будет).
Убедитесь, что содержимое файла task1.dat совпадает с ожидаемым с помощью любого просмотрщика бинарных файлов. Варианты просмотра консольная утилита hexdump: командная строка для этого будет иметь вид $ hexdump -C имя_файла - [task2.s, чтение бинарного файла] Создайте программу, которая находит сумму первых десяти чисел в бинарном файле. Указание: использовать системный вызов _OPEN для открытия файла на чтение (аргументы: имя файла и число 0 для режима чтения); использовать системный вызов _READ аналогично _WRITE из первой задачи. Для проверки можно использовать файл task1.dat из первой задачи.
- [task3.s, чтение с клавиатуры] Чтение с клавиатуры производится с помощью системного вызова _READ (см. задачу 2). В качестве дескриптора файла используется число 0 — дескриптор стандартного потока ввода (_STDIN — введите такую константу). После получения байтов, кодирующих символы, которые ввёл пользователь, обычно используется функция _SSCANF, позволяющая выделить из полученной строки нужную информацию — обычно, целые числа. Данная функция устроена так же, как sscanf в C.
Создайте программу, которая читает одно целое число с клавиатуры и выводит на экран результат проверки его на чётность (слово Even или Odd). Алгоритм:- Завести переменную-буфер buf из 6 символов.
- Прочитать с помощью _READ из _STDIN строку в buf.
- Вызвать _SSCANF, передав ей buf, формат "%d" и смещение (метку) переменной для получения результата.
- Проверить результата ввода на чётность
- Вывести ответ.
- [task4.s, преобразование файла] Создайте программу, которая по данному бинарному файлу целых чисел создаёт новый файл, содержащий только положительные числа из исходного файла в том же порядке. Для определения конца исходного файла проверяйте возвращаемое (в AX) значение _READ, оно равно количеству прочитанных байт; если значение 0, значит файл закончился.
- [task5.s, преобразование файла] Дан бинарный файл целых чисел, обнулить в нём максимальный элемент. Указание: используйте _LSEEK и открытие файла на чтение и запись одновременно (_OPEN в режиме 2). Обратите внимание, что смещение для _LSEEK задается в виде длинного целого.
PUSH 0 ! FROM the begining of file PUSH 0 ! THE HI PART OF LONG OFFSET PUSH CX ! THE LOW PART OF LONG OFFSET PUSH SI ! fd PUSH _LSEEK ! SYS
Пример программы создания бинарного файла целых чисел
_EXIT = 1
_READ = 3
_WRITE = 4
_OPEN = 5
_CLOSE = 6
_CREAT = 8
_LSEEK = 19
_GETCHAR = 117 ! five system subroutine numbers
_SPRINTF = 121
_PUTCHAR = 122
_SSCANF = 125
_PRINTF = 127
STDIN = 0 ! three initially opened file descriptors
STDOUT = 1
STDERR = 2
.SECT .TEXT
PUSH 0600
PUSH file_name
PUSH _CREAT ! create file, file descriptor in AX
SYS
ADD SP, 6
CMP AX, -1
JZ ERROR
PUSH AX
PUSH _CLOSE
SYS
ADD SP, 4
PUSH 0
PUSH _EXIT
SYS
ERROR:
PUSH str_error
PUSH _PRINTF ! AX fmt _PRINTF
SYS
ADD SP, 4
PUSH 0
PUSH _EXIT
SYS
.SECT .DATA
file_name: .ASCIZ "./test1.dat"
str_error: .ASCIZ "Error. File ./test1.dat is not created \n"
.SECT .BSS