Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

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

Предыдущая страница Следующая страница
1 ... 43 44 45 46 47 48 49  50 51 52 53 54 55 56 ... 85
               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) определяется адресом памяти, куда должна
быть помещена запись при чтении или откуда она заносится на диск.  Прежде,
чем  выполнить  операцию  записи  или  чтения,  в  программе    необходимо
Предыдущая страница Следующая страница
1 ... 43 44 45 46 47 48 49  50 51 52 53 54 55 56 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама