Жанр: Учеба

Ассемблер и программирование для IBM PC

сторінка №22

тся действительное число прочитанных записей, а в
FCB в поле относительного номера записи и полях текущих номеров блока и
записи устанавливаются значения, соответствующие следующему номеру записи.
Если необходимо загрузить в память весь файл, но число записей
неизвестно, то следует после операции открытия разделить размер файла на
длину записи. Например, для размера файла шест.320 (800) и длине записи
шест.20 (32) число записей будет шест.19 (25).

ПРОГРАММА: ПРЯМОЕ БЛОЧНОЕ ЧТЕНИЕ
________________________________________________________________

__________________________________________________________________________

TITLE RANBLOK (COM) Прямое блочное чтение файла
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H
BEGIN: JMP MAIN
;----------------------------------------------------
FCBREC LABEL BYTE ;FCB для дискового файла
FCBDRIV DB 04 ; дисковод D
FCBNAME DB 'NAMEFILE' ; имя файла
FCBEXT DB 'DAT' ; тип файла
FCBBLK DW 0000 ; номер текущего блока
FCBRCSZ DW 0000 ; логическая длина записи
FCBFLZ DD ? ; DOS размер файла
DW ? ; DOS дата
DT ? ; DOS зарезервировано
DB 00 ; номер текущей записи
FCBRNRC DD 00000000 ; относительный номер

DSKRECS DB 1024 DUP(?),'$' ;DTA для блока записей

ENDCODE DB 00
NORECS DW 25 ;Число записей
OPENMSG DB '*** Open error ***',13,10,'$'
READMSG DB '*** Open error ***',13,10,'$'
ROWCTR DB 00
; ---------------------------------------------------
MAIN PROC NEAR
CALL Q10CLR ;Очистить экран
CALL Q20CURS ;Установить курсор
CALL E10OPEN ;Открыть файл,
; установить DTA
CMP ENDCODE,00 ;Успешное открытие?
JNZ A30 ; нет - выйти
CALL F10READ ;Читать записи
CALL G10DISP ;Вывод блока на экран
A30: RET ;Завершить программу
MAIN ENDP
; Открыть дисковый файл:
; ---------------------
E10OPEN PROC NEAR
MOV AH,0FH ;Функция открытия файла
LEA DX,FCBREC
INT 21H
CMP AL,00 ;Успешное открытие?
JNZ A30 ; нет - ошибка

MOV FCBRCSZ,0020H ;Размер записи
MOV AH,1AH
LEA DX,DSKRECS ;Установить адрес DTA
INT 21H
RET
E20:
LEA DX,OPENMSG ;Ошибка открытия файла
CALL X10ERR
RET
E10OPEN ENDP
; Чтение блока:
; ------------
F10READ PROC NEAR
MOV AH,27H ;Прямое чтение блока
MOV CX,NORECS ;Число записей
LEA DX,FCBREC
INT 21H
MOV ENDCODE,AL ;Сохранить код возврата
RET
F10READ ENDP
; Вывод блока на экран:
; --------------------
G10DISP PROC NEAR
MOV AH,09 ;Функция вывода на экран
LEA DX,DSKRECS
INT 21H
RET
G10DISP ENDP
; Подпрограмма очистки экрана:
; ---------------------------
Q10CLR PROC NEAR
MOV AX,0600H ;Функция скроллинга
MOV BH,41H ;Цвет (07 для ч/б)
MOV CX,0000
MOV DX,184FH
INT 10H
RET
Q10CLR ENDP
; Подпрограмма установки курсора:
; ------------------------------
Q20CURS PROC NEAR
MOV AH,02 ;Функция установки курсора
MOV BH,00
MOV DH,ROWCTR
MOV DL,00
INT 10H
INC ROWCTR
RET
Q20CURS ENDP
; Подпрограмма сообщения об ошибке диска:
; --------------------------------------
X10ERR PROC NEAR
MOV AH,09 ;DX содержит адрес
INT 21H ; сообщения
MOV ENDCODE,01
RET
X10ERR ENDP

CODESG ENDS
END BEGIN
__________________________________________________________________________

Рис.16.4. Прямое блочное чтение.

На рис.16.4 приведена программа, выполняющая блочное чтение файла,
созданного программой на рис.16.1. Программа устанавливает начальный
относительный номер записи 00, в регистре CX - счетчик на 25 записей и
выводит на экран всю информацию из DTA (только для того, чтобы убедиться,
что информация считана). Другие варианты программы могут включать
установку другого начального номера записи и считывание менее 25 записей.
В программе организованы следующие процедуры:

E10OPEN Открывает файл, устанавливает размер записи в FCB равным 32 и
устанавливает адрес DTA.
F10READ Устанавливает число записей равным 25 и выполняет блочное чтение
G10DISP Выводит блок на экран.

Операция чтения преобразует относительный номер записи 00 в FCB в
номер текущего блока 00 и номер текущей записи 00. В конце операции чтения
в FCB текущий номер записи будет содержать шест.19, а относительный номер
записи - шест.19000000.

АБСОЛЮТНЫЕ ОПЕРАЦИИ ДИСКОВОГО ВВОДА-ВЫВОДА
________________________________________________________________

Для непосредственного доступа к диску можно использовать операции
абсолютного чтения и абсолютной записи с помощью функций DOS INT 25H и
26H. В этом случае не используются оглавление диска и преимущества
блокирования и разблокирования записей, обеспечиваемые функцией DOS INT
21H.
Абсолютные операции предполагают, что все записи имеют размер
сектора, поэтому прямой доступ осуществляется к полному сектору или блоку
секторов. Адресация диска выполняется по "логическому номеру записи"
(абсолютный сектор). Для определения логического номера записи на
двухсторонних дискетах с девятью секторами счет секторов ведется с дорожки
0, сектора 1, следующим образом:

Дорожка Сектор Логический номер записи

0 1 0
0 2 1
1 1 9
1 9 17
2 9 26

Для двухсторонних дискет используется следующая формула:

Логический номер записи = (дорожка х 9) + (сектор - 1)

Например, логический номер записи на дорожке 2 и секторе 9
определяется как

(2 х 9) + (9 - 1) = 18 + 8 = 26

Фрагмент программы для абсолютных операций ввода-вывода:

MOV AL,drive# ;0 для A, 1 для B и т.д.
MOV BX,addr ;Адрес области ввода-вывода
MOV CX,sectors ;Число секторов
MOV DX,record# ;Начальный логический номер записи
INT 25H или 26H ;Абсолютное чтение или запись

Операции абсолютного чтения или запись разрушают содержимое всех
регистров, кроме сегментных, и устанавливают флаг CF для индикации
успешной (0) или безуспешной (1) операции. В случае безуспешной операции
содержимое регистра AL описывает характер ошибки:

AL Причина

1000 0000 Устройство не отвечает
0100 0000 Ошибка установки головок
0010 0000 Ошибка контролера
0001 0000 Ошибка дискеты?

0000 1000 Переполнение DMA при чтении
0000 0100 Сектор не найден
0000 0011 Попытка записи на защищенной дискете
0000 0010 Не найден адресный маркер

Команда INT записывает содержимое флагового регистра в стек. После
завершения команды INT следует восстановить флаги, но проверив перед этим
флаг CF.

ДРУГИЕ ДИСКОВЫЕ ОПЕРАЦИИ
________________________________________________________________

Кроме основных дисковых функций DOS имеется несколько дополнительных
полезных дисковых операций.

Сброс диска: Шест.D
---------------------
Обычно нормальное закрытие файла приводит к занесению всех оставшихся
в буфере записей на диск и корректировке оглавления. В особых случаях
(между шагами программы или аварийном завершении) может потребоваться
сброс диска. Функция DOS шест.D освобождает все файловые буфера и не
корректирует оглавление диска. Если необходимо, то вначале данная функция
закрывает все файлы.

MOV AH,ODH ;Запрос на сброс диска
INT 21H ;Вызов DOS

Установка текущего дисковода: Шест.E
--------------------------------------
Основное назначение функции DOS шест.E - установка номера текущего
(по умолчанию) дисковода. Номер дисковода помещается в регистр DL, причем
0 соответствует дисководу A, 1 - B и т.д.

MOV AH,OEH ;Запрос на установку
MOV DL,02 ; дисковода C
INT 21H ;Вызов DOS

Операция возвращает в регистр AL число дисководов (независимо от
типа). Так как для DOS необходимо по крайней мере 2 логических дисковода A
и B, то DOS возвращает значение 02 и для систем с одним дисководом. (Для
определения действительного числа дисководов используется команда INT
11H).

Поиск элементов оглавления: шест.11 и 12
------------------------------------------
Программной утилите может потребоваться поиск в оглавлении для
доступа к имени файла, например, при удалении или переименовании. Для
доступа к первому или единственному элементу оглавления необходимо
загрузить в регистр DX адрес неоткрытого блока FCB и выполнить функцию
11H. При использовании расширенного блока FCB можно также получить код
атрибута (см.техническое руководство по DOS).

MOV AH,11H ;Запрос на первый элемент
LEA DX,FCBname ;Неоткрытый FCB
INT 21H ;Вызов DOS

FCB может быть расположено по адресу 5CH в префиксе программного
сегмента, предшествующем программе в памяти (DTA по умолчанию). Подробно
см. гл.22.
В регистре AL операция возвращает шест.FF, если элемент не найден, и
шест.00, если найден. Операция устанавливает в DTA номер дисковода (1=A,
2=B и т.д.) имя файла и тип файла.
Если найдено несколько элементов при выборке по шаблону (например,
*.ASM), то для локализации элементов подмножества директории используется
функция 12H:

MOV AH,12H ;Запрос следующего элемента
LEA DX,FCBname ;Неоткрытый FCB
INT 21H ;Вызов DOS

Коды возврата в регистре AL аналогичны кодам функции 11H.

Удаление файла: шест.13
-------------------------
Для удаления файла в программе используется функция DOS 13H. Операция
удаления устанавливает специальный байт в первой позиции имени файла в
оглавлении.


MOV AH,13H ;Запрос на удаление файла
LEA DX,FCBname ;Неоткрытый FCB
INT 21H ;Вызов DOS

Если операция находит и удаляет элемент, то в регистре AL
устанавливается код возврата 00, иначе код равен шест.FF.

Переименование файла: шест.17
-------------------------------
Для переименования файла в программе используется функция DOS
шест.17. Старое имя файла записывается в обычном месте блока FCB, а новое
- начиная со смещения 16.

MOV AH,17H ;Запрос на переименование
LEA DX,FCBname ;Адрес FCB
INT 21H ;Вызов DOS

Символы ? и * в новом имени приводят к сохранению в соответствующих
позициях символов из старого имени. Успешная операция устанавливает в
регистре AL код возврата 00, а безуспешная (файл по старому имени не
найден или по новому имени уже существует) - код FF.

Получение текущего номера дисковода: шест.19
----------------------------------------------
Функция DOS шест.19 позволяет определить текущий номер дисковода:

MOV AH,19H ;Получить текущий дисковод
INT 21H ;Вызов DOS

Операция возвращает шест. номер дисковода в регистре AL (0=A, 1=B и
т.д.). Полученное значение можно поместить непосредственно в FCB для
доступа к файлу с текущего дисковода.
Кроме перечисленных существуют функции для получения информации из
таблицы FAT (1B и 10), установки поля прямой записи (24), установки
вектора прерываний (25), создания нового программного сегмента (26) и
анализа имени файла (29). Эти функции описаны в техническом руководстве по
DOS.

ПРОГРАММА: ВЫБОРОЧНОЕ УДАЛЕНИЕ ФАЙЛОВ
________________________________________________________________

__________________________________________________________________________

TITLE SELDEL (COM) Выборочное удаление файлов
; Предполагается текущий дисковод;
; Примеры параметров: *.*, *.BAK, и т.д.
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H
BEGIN JMP MAIN
; ----------------------------------------------------------
TAB EQU 09
LF EQU 10
CR EQU 13
CRLF DB CR,LF,'$'
DELMSG DB TAB,'Erase','$'
ENDMSG DB CR,LF,'No more directory entries',CR,LF,'$'
ERRMSG DB 'Write protected disk','$'
PROMPT DB 'y = Erase, N = Keep, Ret = Exit',CR,LF,'$'
; ----------------------------------------------------------
MAIN PROC NEAR ;Главная процедура
MOV AH,11H ;Найти первый элемент
CALL D10DISK
CMP AL,0FFH ;Если нет элементов,
JE A90 ; то выйти
LEA DX,PROMPT ;Текст запроса
CALL B10DISP
A20:
LEA DX,DELMSG ;Выдать сообщение
CALL B10DISP ; об удалении файла
MOV CX,11 ;11 символов
MOV SI,81H ;Начало имени файла
A30:
MOV DL,[SI] ;Текущий символ
CALL C10CHAR ; для вывода на экран
INC SI ;Следующий символ
LOOP A30
MOV DL,'?'
CALL C10CHAR
MOV AH,01 ;Получить односимвольный
INT 21H ; ответ
CMP AL,ODH ;Символ Return?

JE A90 ; да - выйти
OR AL,00100000B ;Перекодировать
; в прописную букву
CMP AL,'y' ;Запрошено удаление?
JNE A50 ; нет - обойти,
MOV AH,13H ; да - удалить файл
MOV DX,80H
INT 21H
CMP AL,0 ;Успешное удаление?
JZ A50 ; да - обойти
LEA DX,ERRMSG ; нет - выдать
CALL B10DISP ; предупреждение
JMP A90
A50:
LEA DX,CRLF ;Перевести строку на экране
CALL B10DISP
MOV AH,12H
CALL B10DISK ;Получить следующий элемент
CMP AL,0FFH ;Есть еще?
JNE A20 ; да - повторить
A90:
RET ;Выход в DOS
MAIN ENDP
; Вывод строки на экран;
; ---------------------
B10DISP PROC NEAR ;в DX находится адрес
MOV AH,09 ; строки
INT 21H
RET
B10DISP ENDP
; Вывод символа на экран;
; ----------------------
C10CHAR PROC NEAR ;в DL находится символ
MOV AH,02
INT 21H
RET
C10CHAR ENDP
; Чтение элемента каталога:
; ------------------------
D10DISK PROC NEAR
MOV DX,5CH ;Установить FCB
INT 21H
CMP AL,0FFH ;Есть еще элементы?
JNE D90
PUSH AX ;Сохранить AL
LEA DX,ENDMSG
CALL B10DISP
POP AX ;Восстановить AL
D90: RET
D10DISK ENDP

CODESG ENDS
END BEGIN
__________________________________________________________________________

Рис.16.5. Выборочное удаление файлов.

На рис.16.5 приведена COM-программа по имени SDEL, иллюстрирующая
функции DOS 11H, 12H и 13H для удаления выбранных файлов. Для запроса на
удаление файлов пользователь может ввести,например, следующие команды:

SDEL *.* (все файлы)
SDEL *.BAK (все BAK-файлы)
SDEL TEST.* (все файлы по имени TEST)

Посредством DOS программа определяет в оглавлении элементы,
удовлетворяющие запросу. DOS заносит полное имя найденного элемента в PSP
(префикс программного сегмента) по смещению шест.81 (DTA по умолчанию).
Затем программа выводит на экран имя файла и запрос подтверждения. Ответ Y
(да) разрешает удаление, N (нет) сохраняет файл, а Return завершает
выполнение.
Обратите внимание на то, что данная программа должна быть создана как
COM-программа, так как EXE-программа требуют отличной адресации для
использования смещений шест.5С и 81 в PSP. Для тестирования программы
используйте скопированные временно файлы.


ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________

- Программа, использующая INT 21H в базовой версии DOS для операций
ввода-вывода на диск, должна содержать блок управления файлом (FCB) для
каждого доступного файла.

- Один блок содержит 128 записей. Номер текущего блока и номер
текущей записи в FCB указывают на дисковую запись, которая должна быть
обработана.

- В обратной последовательности байт в FCB записываются следующие
элементы: номер текущего блока, размер записи, размер файла и
относительный номер записи.

- Все программы, обрабатывающие один и тот же файл, должны иметь
одинаково описанный блок FCB.

- Область ввода-вывода (DTA) определяется адресом памяти, куда должна
быть помещена запись при чтении или откуда она заносится на диск. Прежде,
чем выполнить операцию записи или чтения, в программе необходимо
установить каждую область DTA.

- Операция открытия файла устанавливает в блоке FCB значения для
следующих элементов: имя файла, тип файла, размер записи (шест.80), размер
файла и дата. Программа должна заменить размер записей на правильное
значение.

- Программа, использующая для записи файла операцию DOS INT 21H,
должна закрыть файл в конце обработки для того, чтобы поместить на диск
все оставшиеся в буфере записи (если таковые имеются) и скорректировать
соответствующий элемент оглавления.

- При использовании для чтения и записи операции DOS INT 21H система
автоматически изменяет текущий номер записи в FCB.

- Операция чтения по прерыванию DOS INT 21H проверяет наличие
требуемой записи сначала в буфере и при отсутствии выполняет чтение с
диска.

- Прямой метод доступа требует указания номера записи в поле
относительного номера записи блока FCB.

- Восемь байт (двойное слово) относительного номера записи кодируются
в обратной последовательности байт.

- Если требуемая запись при прямом доступе уже находится в буфере, то
система передает ее непосредственно в DTA. В противном случае выполняется
чтение с диска в буфер всего сектора, содержащего необходимую запись.

- Операции прямого блочного чтения и записи более эффективны при
наличии достаточной памяти. Эти операции особенно удобны для загрузки
таблиц.

- Команды DOS INT 25H и 26H осуществляют дисковые операции
абсолютного чтения и записи, но не поддерживают обработку оглавления, не
определяют конец файла и не обеспечивают блокирование и деблокирование
записей.

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
________________________________________________________________

16.1. Напишите функции базовой версии DOS для следующих операций: а)
создание файла, б) установка DTA, в) последовательная запись, г) открытие
файла, д) последовательное чтение.

16.2. Программа использует размер записи, устанавливаемый при
открытии файла по умолчанию. а) Сколько записей содержит один сектор? б)
Сколько записей содержит дискета с тремя дорожками по девять секторов на
каждой? в) Если на дискете (б) находится один файл, то при
последовательном чтении сколько произойдет физических обращений к диску?

16.3. Напишите программу, которая создает дисковый файл, содержащий
записи из трех элементов: номер товара (пять символов), наименование
товара (12 символов) и стоимость единицы товара (одно слово). Ввод этих
значений должен осуществляться пользователем с клавиатуры. Не забудьте
преобразовать числа из ASCII представления в двоичное представление.


16.4. Напишите программу, которая выводит на экран файл, созданный в
вопросе 16.3.

16.5. Определите текущий блок и запись для следующих номеров записей
при прямом доступе: а)45, б)73, в)150, г)260.

16.6. В каком виде номер записи 2652 (десятичное) устанавливается в
поле относительной записи блока FCB?

16.7. Укажите шестнадцатеричные номера функций для следующих
операций: а) прямая запись, б) прямое чтение, в) прямая блочная запись, г)
прямое блочное чтение.

16.8. Напишите команды для определения числа записей файла,
предполагая, что операция открытия уже выполнена. Имена полей с размером
файла FCB FLSZ и размером записи FCB FCSZ.

16.9. Используя программу из вопроса 16.4 для создания файла с
количеством, ценами и наименованиями товаров, сформируйте файл с
приведенными ниже данными. Напишите программу, которая выполняет одно
блочное чтение данного файла и выводит каждую запись на экран.

Номер Цена Наименование

023 00315 Ассемблеры
024 00430 Компоновщики
027 00525 Компиляторы
049 00920 Компрессоры
114 11250 Экстракторы
117 00630 Буксиры
122 10520 Лифты
124 21335 Процессоры
127 00960 Станки для наклеивания меток
232 05635 Черпатели?
999 00000

16.10. Измените программу из вопроса 16.9 так, чтобы цены
записывались на диск в двоичном формате.

16.11. Измените программу из вопроса 16.9 так, чтобы а)
использовалась операция прямого чтения, б) пользователь мог вводить номер
и количество товара и в) выполнялось вычисление и вывод на экран стоимости
(произведение количества товара на стоимость единицы товара).

ГЛАВА 17 Дисковая память III: Расширенные функции DOS


__________________________________________________________________________

Ц е л ь: Ознакомить с расширенными функциями DOS, начиная с версии
2.0 для обработки дисковых файлов.

ВВЕДЕНИЕ
________________________________________________________________

Функции базовой версии DOS для обработки файлов, показанные в главе
16, действительны для всех последующих версий DOS. В данной главе показаны
ряд расширенных функций, введенных в версиях DOS 2.0 и 3.0 и не
поддерживаемых в ранних версиях. Прежде, чем пытаться выполнить дисковые
операции из данной главы, следует убедиться в наличии необходимой версии
DOS.
Многие из расширенных функций проще своих аналогов в базовой версии
DOS. В руководствах по DOS рекомендуется использовать новые функции,
которые более естественны для систем типа UNIX. Некоторые операции
включают использование строк в формате ASCIIZ для начальной установки
дисковода, пути доступа и имени файла; номера файла для последовательного
доступа к файлу; специальных кодов возврата.

ДАННЫЕ В ФОРМАТЕ ASCIIZ
________________________________________________________________

При использовании многих расширенных функций для дисковых операций
необходимо сообщить DOS адрес строки в формате ASCIIZ, содержащей
идентификацию файла в виде номера дисковода, пути доступа и имени файла
(все параметры необязательные) и строка должна завершаться
шестнадцатеричным нулем, например:

PATHNM1 DB 'B:\TEST.ASM',0
PATHNM2 DB 'C:\UTILITY\NU.EXE',0

Обратная косая (или прямая косая) используются в качестве
разделителя. Нулевой байт (zero) завершает строку (отсюда название ASCIIZ
формата). Для прерываний, использующих в качестве параметра ASCIIZ строку,
адрес этой строки загружается в регистр DX, например, командой LEA
DX,PATHNM1.

ФАЙЛОВЫЙ НОМЕР И КОДЫ ВОЗВРАТА
________________________________________________________________

Операции создания и открытия файла требуют загрузки в регистр AX
двухбайтового числа, представляющего собой файловый номер. В главе 8
показано, что стандартные устройства не нуждаются в операции открытия и
могут использовать непосредственно файловые номера: 0 - ввод, 1 - вывод, 2
- вывод сообщений об ошибках, 3 - внешнее устройство, 4 - принтер.
Для доступа к диску при создании или открытии файла используется
ASCIIZ строка и функции DOS шест.3C или 3D. Успешная операция
устанавливает флаг CF в 0 и помещает файловый номер в регистр AX. Этот
номер необходимо сохранить в элементе данных DW и использовать его для
всех последующих операций над дисковым файлом. При неуспешной операции
флаг CF устанавливается в 1, а в регистр AX помещается код ошибки,
зависящий от операции (см.табл.17.1).

__________________________________________________________________________

01 Ошибка номера функции
02 Файл не найден
03 Путь доступа не найден
04 Открыто слишком много файлов
05 Нет доступа (Операция отвергнута)
06 Ошибка файлового номера
07 Блок управления памятью разрушен
08 Недостаточно памяти
09 Ошибка адреса блока памяти
10 Ошибка оборудования
11 Ошибка формата
12 Ошибка кода доступа
13 Ошибка данных
15 Ошибка дисковода
16 Попытка удалить оглавление
17 Другое устройство ?
18 Нет больше файлов
__________________________________________________________________________

Таб.17.1. Коды ошибок

СОЗДАНИЕ ДИСКОВОГО ФАЙЛА
________________________________________________________________

В последующих разделах раскрыты требования к с

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.