Чтение, запись, позиционирование в файле
При нажатии клавиши Пробел в начале ввода очередной строки (ASCII-код – 3210 или 2016) направление ввода данных в файл изменяется следующим образом: файл расширяется на величину, равную количеству уже введенных символов, и дальнейший ввод осуществляется с конца файла. Завершение работы программы определяется моментом, когда оба введенных потока b в файле встречаются (не перекрываясь).
:prg07_09.asm – программа заполнения файла my_file.txt данными в виде строк символов. :вводимыми с клавиатуры. buf_Oahstruc len_buf db 83;длина buf_0ah len_in db 0 действительная длина введенного слова (без учета 0dh) buf_in db 82 dup (20h):буфер для ввода Сс учетом 0dh и позднее добавляем Oah) ends .data handle dw 0:дескриптор файла filename db 'my_file.txt',0 point_fname dd filename buf buf_0ah<> prev_d label dword;для сохранения длины предыдущей строки при выводе с конца файла prev dw 0 dw 0 middle dd 0;позиция в середине файла, при достижении которой снизу выходим:из программы .code :-----открываем файл-----………………………….-- хоrсх.сх;атрибуты файла – обычный файл movbx,2;режим доступа – доступ для чтения-записи, режим буферизации MS DOS movdx,12h;если файл существует, то открыть его без сохранения прежнего содержимого, :в обратном случае создать его Ids si,point_fname:формируем указатель на имя файла movah.6ch;номер функции DOS int 21h открываем (создаем) файл jc exit:если ошибка, то переход на конец;действия при успешном открытии файла: mov handle.ax,-сохраним дескриптор файла;– позиционируем файловый указатель с начала файла……. mov ah.42h хоr al,al хоr ex,ex хоr dx.dx mov bx, handle int 21h cycl:;вводим очередную строку с клавиатуры lea dx.buf mov ah,Oah Int 21h;для красоты ввода выводим на экран символ Oah mov dl.Oah mov ah.2 int 21h emp buf.buf_in.20h;первый символ введенной строки сравниваем с пробелом je revers;переход на изменение ввода – добавляем Oah в конец введенной строки lea si.buf.buf_in mov al.buf.lenjn cbw push si add si,ax incsi учитываем неучтенный в lenjn символ 0dh mov byte ptr [si],Oah H--……вывод в файл:……………………..---…….. I popdx указатель на область, откуда будем выводить строку mov bx.handle add ax,2 учитываем неучтенный в len_in символ 0dh movcx.ax:длина выводимых данных mov ah.40h int 21h jmp cycl revers:;записываем файл с конца, предварительно расширив его ;узнаем. сколько было уже записано до этого:;для этого вначале сбрасываем буферы на диск mov bx.handle mov ah.68h int 21h;теперь можно и узнать – определение длины файла: mov al,2 хоr сх.сх хоr dx.dx;CX:DX – 0 – нулевое смещение mov ah,42h int 21h:в DX:AX возвращается длина файла в байтах jc exit:если ошибка:формируем полную длину в edx shl eax,16 shld edx.eax,16 mov middle.edx сохраним как условие выхода из программы при достижении снизу расширение файла ;с помощью функции 42h int 21h и последующей записи :умножаем длину на 2. при первой операции записи файл расширится: shl edx.l shld ecx.edx.16 mov al.O хоr сх.сх mov ah.42h int 21h расширяем файл, устанавливая указатель jc exit:если ошибка расширим файл, выведя последнюю введенную строку с пробелом: