Предыдущий раздел ОПЕРАЦИИ С ФАЙЛАМИ Следующая глава

16.7.1 Модернизация редактора для работы с файлами - алгоритм диспетчера

Сейчас мы приступим к модернизации разработанного ранее редактора информации так, чтобы он был пригоден для редактирования не только информации в сегменте ОП, занимаемого программой, но и для редактирования файлов на магнитных дисках.

Модернизацию редактора мы начнем с центрального модуля, то есть с диспетчера. Его новый алгоритм приведен на рис.54. Как видно из этого рисунка, существенное развитие получила начальная фаза выполнения диспетчера, после успешного завершения которой должен выполняться прежний алгоритм диспетчера. Напомним, что прежний алгоритм диспетчера решает задачу распознавания команды пользователя в виде нажатия одной из клавиш <Fi> и инициирования того модуля редактора, который выполняет данную команду.

Начальная фаза нового диспетчера начинает с того, что опрашивает пользователя о его желании редактировать какой-то файл на диске. В случае его отказа сбрасывается в ноль признак работы с файлом – переменная с именем Prf. А далее выполняется прежний алгоритм диспетчера. В случае согласия пользователя редактировать файл ему выдается просьба ввести имя.

 

Рис. 54. Алгоритм диспетчера для работы с файлами

 

этого, уже существующего файла. Имя файла записывается в качестве содержимого переменной Filename.

Возможная реализация первых двух этапов алгоритма:

 

mov   dx, Msg                 ; DX ß адрес строки сообщения

mov   ah, 9                     ; Вывод строки

int     21h                       ;        на экран

mov   ah, 1                    ; Ввод символа с

int     21h                      ;        клавиатуры

or      al, 20h                 ; Перевод символа на нижний регистр

cmp   al, ‘y’                   ; Введен символ ‘y’ или ‘Y’ ?

jnz     .M                        ; Если нет

 

В случае согласия с вопросом программы пользователь должен ввести “y” или “Y”. Так как коды этих двух символов (79h и 59h) отличаются только одним битом 5, то установка этого бита командой or преобразует код символа “Y” в код символа “y”. Напомним, что команда логического сложения or сравнивает оба операнда побитно. Если хотя бы один из сравниваемых битов содержит “1”, то в результирующий бит также записывается “1”. Результат сравнения (слово или байт) записывается на место первого операнда.

Далее производится открытие указанного пользователем файла на чтение и на запись. Если открытие произошло успешно, то логический номер файла записывается в переменную Lognum. Далее определяется Lf – длина открытого файла в секторах по 256 байт. Эта длина находится в два этапа. На первом этапе определяется длина файла в байтах (используя системный вызов установки указателя файла). На втором этапе длина файла в байтах (находится в регистрах CX и DX) делится на длину сектора (256 байтов). Для того чтобы был учтен и последний сектор файла, перед делением необходимо длину файла в байтах увеличить на число 255. Возможная реализация данного этапа:

 

mov   cx, 0                    ; В CX:DX будет

mov   dx, 0                    ; длина файла

mov   bx, [Lognum]       ; Установка

mov   al, 2                     ; указателя

mov   ah, 42h                ; на конец

int     21h                     ;  файла

mov   bx, dx                  ;BX ß младшая часть длины в байтах

xor    dx, dx                  ;DX ß 0

mov   ax, 255                ;AX ß 255

add   ax, bx                   ;Сумма младшей части длины и 255

adc    dx, cx                  ;Сумма старшей части длины и (CF)

mov   bx, 256                ;BX ß длина сектора

div     bx                       ;Деление (DX:AX) на BX

mov   [Lf], ax               ;Lf ß длина файла в секторах

 

Обратите внимание на использование оператора суммирования с флагом переноса adc. Он применяется для того, чтобы учесть возможный перенос при суммировании младшей части длины файла (в BX) и числа 255 (в AX). В результате единица переноса суммируется со старшей частью длины.

После того, как на экран будет выведено сообщение о длине файла в секторах (по 256 байт), величина Lf сравнивается с числом 256.  Если Lf > 256, то принимается Lf = 256. Это делается для того, чтобы редактируемая часть файла не вышла за пределы, предусмотренные нашим редактором. При этом предельная длина редактируемой части файла равна размеру стандартного сегмента ОП, то есть 64 К = 256 секторов по 256 байтов.

После этого в переменную Prf эаписывается значение 1. Далее выполняется прежний алгоритм диспетчера.

 


Предыдущий раздел В начало Следующая глава