Assembler #10 Чтение файлов
@Torchik_RuДоброго времени суток, Господа. Сегодня мы будем изучать чтение файлов в языке ASM.
sys_open
Для старта нам надо использовать системный вызов sys_open
для открытия файла. Первым аргументом он получает указатель на zero-terminated строку - имя файла.
Вторым аргументом - флаги.
Третий аргумент - режим открытия файла, 4-числовое восьмеричное число, про которое мы говорили ранее.
Очень больших различий на этом этапе с записью в файлы нету. Ниже я привел небольшой код, который открывает файл с флагом "только чтение".
mov rax, SYS_OPEN mov rdi, filename mov rsi, O_RDONLY mov rdx, 0644o syscall
Как Вы можете видеть, тут всё работает по аналогии с записью.
sys_read
Этот системный вызов может использоваться для чтения информации из файлов. Это работает точно так-же, как и получение ввода от юзера, только первый аргумент меняется на файловый дескриптор, что мы получаем из sys_open
.
Часть кода, которая прозводит чтение из файла:
mov rdi, rax mov rax, SYS_READ mov rsi, text mov rdx, 17 syscall
sys_close
Этот системный вызов, как Вы уже знаете принимает только один аргумент - файловый дескриптор.
Вот код, который закрывает файл:
mov rax, SYS_CLOSE pop rdi syscall
Пример работы
%include "linux64.inc" section .data filename db "myfile.txt",0 section .bss text resb 18 section .text global _start _start: ;открытие файла mov rax, SYS_OPEN mov rdi, filename mov rsi, O_RDONLY mov rdx, 0 syscall ;чтение из файла push rax mov rdi, rax mov rax, SYS_READ mov rsi, text mov rdx, 17 syscall ;закрытие файла mov rax, SYS_CLOSE pop rdi syscall print text exit
Скачать linux64.inc