|
В этой статье приведен пример работы с файлами с помощью системных вызовов ядра linux на ассемблере gas
- a gnu assembler. Программа создает новый файл, записывает в него строку, а потом читает эту строку из файла и выводит на экран,
как и в предыдущих примерах вы можете скачать исходный текст и саму программу по ссылке внизу, естественно бесплатно .
Используются системные вызовы write, read, creat, iseek, open, close и exit. Я не стал добавлять системный вызов unlink - удаление
файла, чтобы вы могли посмотреть его содержимое после выполнения программы.
Листинг faily.s :
.data
msg1:         # строка, которую мы записываем в файл
        .ascii "Hello, world!\n I am from new file - filenowyi.txt !\n "
len1 = . - msg1         # ее длина
name:         # имя файла, который создаем
.ascii "filenowyi.txt "
.bss
.lcomm buff, 35         # куда будем читать из файла, и максимальное количество символов (35)
.text
.global _start         # начало программы
_start:
movl $8,%eax         # системный вызов sys_creat его номер 8
movl $name,%ebx         # в параметры имя файла
movl $511,%ecx         # и режим доступа 511 - это восьмеричные 777, то есть полный доступ всем
int $0x80         # создаем
movl $5,%eax         # системный вызов sys_open
movl $name,%ebx         # имя файла - первый параметр
movl $2,%ecx         # второй параметр - режим открытия ( 2 - чтение и запись, 0 - чтение , 1 - запись )
int $0x80         # открываем
movl %eax,%ebx         # в аккумулятор был возвращен дескриптор файла, помещаем в ebx
movl $len1,%edx         # системный вызов sys_write вы сним знакомы
movl $msg1,%ecx
movl $4,%eax
int $0x80         # записываем строку в файл
movl $19,%eax         # системный вызов sys_iseek его номер 19, установить позицию в файле, 1-й параметр - дескриптор файла, он у нас в ebx и лежит
xorl %ecx,%ecx         # нам надо начало поэтому 2-й параметр - смещение ставим 0 и
xorl %edx,%edx         # третий параметр - откуда считать смещение ставим 0 - от начала файла ( я зануляю логически, т.к. это быстрее и меньше занимает места )
int $0x80         # устанавливаем позицию на начало
movl $3,%eax         # чтение из файла системный вызов sys_read - вы с ним знакомы ( см. hello user )
movl $buff,%ecx
movl $len1,%edx
int $0x80         # читаем
pushl %ebx         # сохраняем дескриптор нашего файла
movl $4,%eax         # выводим прочитанное на экран
movl $1,%ebx
movl $buff,%ecx
movl $len1,%edx
int $0x80         # выводим
popl %ebx         # первый и единственный параметр системного вызова sys_close - дескриптор файла, который закрываем
movl $6,%eax         # номер вызова - 6
int $0x80         # закрываем наш файл
_exit:         # выходим из программы
movl $0,%ebx
movl $1,%eax
int $0x80
# ВСЕ!
Непосредственно вводимый код выделен фиолетовым цветом , все остальное(зеленым) - комментарии.
Компилируем так
as -s -o faily.o faily.s
ld -s -o faily faily.o
скачать архив с исходным кодом и исполняемым файлом этого примера
tar.gz
zip
Добавлю, что можно было бы обойтись без вызова iseek, но тогда надо было бы закрыть файл и открыть его снова, чтобы вы поняли какую роль играет iseek,
запустите программу один раз, потом вручную откройте текстовым редактором файл filenowyi.txt , и допишите в него все что вам взбредет в голову, а
потом закомментируйте блок вызова iseek, перекомпилируйте и запустите программу, на экран выведется то что вы дописывали вручную,
так как после записи текущая позиция для чтения не возвращалась в начало, и программа прочитала то , что дальше.
С уважением Pauk_pv ©
|