логотип нашего сайта о программировании для начинающих

Программирование на ассемблере для начинающих. Ассемблер gas под linux, fasm под windows, tasm под dos, и многое другое.


Сайт для программистов, начинающих кодеров, и людей, желающих заняться программированием.



Меню невыпадающее
Программистам : Другое :

Работа с файлами через системные вызовы ядра Linux в ассемблере gas !

В этой статье приведен пример работы с файлами с помощью системных вызовов ядра 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 ©

Здесь со времнем появятся ссылки дружественных и понравившихся сайтов

Информер ТИЦ

люстры в античном стиле
плита перекрытия пп|домофон киев|cerato kia ua

Сайт создан Pauk_pv // Pauk@paukpv.pp.ru

Rambler's Top100 Каталог@MAIL.RU - каталог ресурсов интернет

При использовании информации с сайта обязательна ссылка на сайт
Pauk_pv ©