Помогите выйти из бесконечного цикла

Я пытаюсь прочитать весь текстовый файл посимвольно и вывести его содержимое в терминал, но попадаю в бесконечный цикл вывода первого символа из файла. Помогите резобраться в чем проблема. Вот код (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 шт):

Автор решения: Alex F

Отвечаю на вопрос, как читать файл. Итак:

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).

→ Ссылка