Сборник по задачам и примерам Assembler



         

Запись в файл или устройство - часть 3


mov bx.handle

mov ah.68h

int 21h ;теперь можно и узнать - определение длины файла:

mov al ,2

хог сх.сх

хог 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

хог сх.сх

mov ah.42h

int 21h расширяем файл, устанавливая указатель

jc exit :если ошибка расширим файл, выведя последнюю введенную строку с пробелом:

cycl2: lea si,buf,buf_in

mov al .buf .lenjn

cbw ptush si

add si.ax

incsi учитываем неучтенный в lenjn символ 0dh

добавляем Oah в конец введенной строки

mov byte ptr [si],Oah ;выводим в файл:

popdx указатель на область, откуда будем выводить строку

add ах.2 учитываем неучтенный в len_in символ 0dh

movcx.ax :длина выводимых данных

movprev.ax .сохраним длину для корректировки при выводе следующей строки

mov bx.handle movah.40h int 21h jc exit

;сбрасываем буфер, чтобы смотреть изменения в файле при работе в отладчике -:легче запретить (см. обсуждение ниже)

mov bx,handle

mov ah,68h Int 21h :вводим очередную строку с клавиатуры

lea dx.buf

mov ah.Oah

Int 21h :для красоты ввода выводим на экран символ Oah

mov dl .Oah

mov ah,2

int21h

;......использование 42h с отрицательным смещением относительно

:текущего значения файлового указателя:

устанавливаем файловый указатель в позицию вывода следующей строки

;с учетом того, что выводим с конца (текущей позиции) файла:

хог есх.есх

mov al.buf,len_in

cbw

add prev.ax

add prev.2 учитываем наличие OdOah

sub ecx.prev_d :получаем отрицательное смещение - сформируем его в паре СХ:DX

shrd edx,ecx,16

shr edx.16 :довернем edx

shr ecx.16 :и есх устанавливаем файловую позицию для записи очередной строки

mov bx,handle

mov ah.42h




Содержание  Назад  Вперед