Помогите выйти из бесконечного цикла
Я пытаюсь прочитать весь текстовый файл посимвольно и вывести его содержимое в терминал, но попадаю в бесконечный цикл вывода первого символа из файла. Помогите резобраться в чем проблема. Вот код (Nasm x86):
section .data
file: db "./test.txt", 0
O_RDONLY equ 0
O_WRONLY equ 1
O_RDWR equ 2
O_CREATE equ 100o
O_TRUNC equ 1000o
O_APPEND equ 2000o
section .bss
constdescriptor resb 4 ; для открытия и закрытия файла
descriptor resb 4 ; тут должен храниться адрес кажого байта информации
buffer resb 1 ; для вывода на экран
section .text
global _start
_start:
openFile:
mov eax, 5 ; открыть
mov ebx, file ; наш файл
mov ecx, O_RDWR ; в режиме для записи и чтения
mov edx, 1
int 0x80 ; выполнить прерывание
mov [descriptor],eax ; сохранили дескрипор файла (совпадает с адресом первого символа в файле)
mov [constdescriptor], eax ; то же самое в другую переменную
read:
mov eax, 3 ; читаем
mov ebx, [descriptor] ; с адреса первого символа в файле (по идее, в дальнешем в переменной дескриптор должен храниться адрес второго, третьего и т.д. символа)
mov ecx, buffer ; в буфер
mov edx, 1
int 80h ; Считали информацию из файла
cmp eax,0 ; если считанный символ 0 (EOF)
je close ; на выход
jne next ; иначе к метке next
close:
mov eax,6 ; закрываем
mov ebx,[constdescriptor] ; наш файл
int 0x80 ;закрытие файла
mov eax, 1 ; выходим из программы
mov ebx, 0 ; с кодом "Нет ошибок"
int 0x80 ; выход
next:
; если не достигнут конец файла
mov eax, 4 ; пишем
mov ebx, 1 ; на экран
mov ecx, buffer ; то, что у нас в буфере осталось с read
mov edx, 1
int 0x80 ; "Записали" на экран
mov ebx, [descriptor] ; к дескриптору
add ebx, 1 ; прибавляем один (должно выйти то, что только что записали + 1 байт)
mov [descriptor], ebx ; сохраняем адрес нового символа в переменную
jmp read ; возвращаемся к чтению
Но я попадаю в бесконечный цикл с выводом первого символа в файле, помогите.
Ответы (1 шт):
Отвечаю на вопрос, как читать файл. Итак:
mov eax, 5 ; открыть
mov ebx, file ; наш файл
mov ecx, O_RDWR ; в режиме для записи и чтения
mov edx, 1
int 0x80 ; выполнить прерывание
Теперь в eax находится дескриптор файла. Это не указатель. Когда OS открывает файл, то создается некоторая стуктура, в которой хранится текущее состояние файла. В том числе offset, при открытии он 0. Единственное, что вы можете делать с дескриптором - это передавать его в другие функции: read, close.... Сделали read 1 байт, получили его. offset теперь стал 1. Сделали еще read - получили следующий символ.
Дескриптор может быть реализован как указатель на неизвестную нам структуру, или индекс в какой-то таблице. Мы пользуемся им для вызова функций, не зная, что это такое. По английски это еще называют handle или cookie (не путать с Internet cookies).