Предыдущий раздел | ОПЕРАЦИИ С ФАЙЛАМИ | Следующая глава |
Сейчас мы приступим к модернизации разработанного ранее редактора информации так, чтобы он был пригоден для редактирования не только информации в сегменте ОП, занимаемого программой, но и для редактирования файлов на магнитных дисках.
Модернизацию редактора мы начнем с центрального модуля, то есть с диспетчера. Его новый алгоритм приведен на рис.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. Далее выполняется прежний алгоритм диспетчера.
Предыдущий раздел | В начало | Следующая глава |