Иллюстрированный самоучитель по задачам и примерам Assembler

Чтение, запись, позиционирование в файле

При нажатии клавиши Пробел в начале ввода очередной строки (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:если ошибка расширим файл, выведя последнюю введенную строку с пробелом:
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.