Главная · Поиск книг · Поступления книг · 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 ... 39 40 41 42 43 44 45  46 47 48 49 50 51 52 ... 85
          64, то байт 36 всегда содержит 00.

     Помните, что числовые значения в словах и двойных словах записываются
в обратной последовательности байтов.
     Блоку  FCB  предшествует  необязательное  семибайтовое    расширение,
которое  можно  использовать  для  обработки  файлов    со    специальными
атрибутами.  Для использования расширения необходимо закодировать в первом
байте шест.FF, во втором -  атрибут  файла,  а  в  остальных  пяти  байтах
шест. нули.


     ИСПОЛЬЗОВАНИЕ БЛОКА FCB ДЛЯ СОЗДАНИЯ ФАЙЛА НА ДИСКЕ
     ________________________________________________________________

     Для  ссылки  на  каждый  дисковый  файл  программа  должна  содержать
правильно составленный блок управления файлом.  Операции  ввода-вывода  на
диск требуют установки адреса блока FCB в  регистре  DX.  Доступ  к  полям
блока FCB осуществляются по этому адресу с помощью регистровой пары DS:DX.
Для  создания  нового  файла  программа  использует  функцию  шест.16    в
прерывании DOS INT 21H следующим образом:

               MOV  AH,16H     ;Создание
               LEA  DX,FCBname ; дискового файла
               INT  21H        ;Вызов DOS

     DOS  осуществляет  поиск  имени  файла  и  тип  файла,  взятого    из
соответствующих  полей  FCB,  в  оглавлении.  Если  элемент    оглавления,
содержащий  необходимое  имя  (и  тип),  будет  найдено,  то  DOS  очищает
найденный элемент для нового использования, если такой  элемент  не  будет
найден, то DOS ищет свободный элемент. Затем операция устанавливает размер
файла в 0 и  "открывает"  файл.  На  этапе  открытия  происходит  проверка
доступного    дискового    пространства,    результат    такой    проверки
устанавливается в регистре AL:

               00   На диске есть свободное пространство
               FF   На диске нет свободного пространства.

     При открытии также устанавливается в блок FCB номер текущего блока  -
0 и размер записей (по умолчанию) -  128  (шест.80)  байтов.  Прежде,  чем
начать запись файла, можно заменить это значение по умолчанию на требуемый
размер записей.
     Для  определения  выводной  записи  необходимо   прежде    обеспечить
начальный адрес этой записи в область передачи данных (DTA - disk trausfer
area).  Так как блок FCB содержит размер записей, то в  DTA  не  требуется
устанавливать ограничитель конца записи.  Затем с помощью функции  шест.1A
необходимо сообщить DOS адрес DTA.  В  любой  момент  времени  может  быть
активен только один DTA. В следующем примере инициализируется адрес DTA:

               MOV  AH,1AH         ;Установка адреса
               LEA  DX,DTAname     ; DTA
               INT  21H            ;Вызов DOS

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

               MOV  AH,15          ;Последовательная
               LEA  DX,FCBname     ; запись
               INT  21H            ;Вызов DOS

     Операция записи использует информацию из блока FCB и  адрес  текущего
буфера DTA.  Если длина записи равна размеру сектора, то запись  заносится
на диск.  В противном случае записи заполняют буфер  по  длине  сектора  и
затем буфер записывается на  диск.  Например,  если  длина  каждой  записи
составляет 128 байтов,  то буфер заполняется четырьмя записями (4*128=512)
и затем буфер записывается в дисковой сектор.
     После успешного занесения записи на диск DOS увеличивает в блоке  FCB
размер файла на размер записи и текущий номер записи  на  1.  Когда  номер
текущей записи достигает 128, происходит сброс этого значения в 0 и в  FCB
увеличивается номер текущего блока на 1. Операция возвращает в регистре AL
следующие коды:

               00   Успешная запись.
               01   Диск полный.
               02   В области DTA нет места для одной записи.

     Когда запись файла завершена, можно, хотя и  не  всегда  обязательно,
записать маркер конца файла (шест.1A).  Для  закрытия  файла  используется
функция шест.10:

               MOV  AH,10H         ;Закрыть
               LEA  DX,FCBname     ; файл
               INT  21H            ;Вызов DOS

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

               00   Успешная запись.
               FF   Описание файла оказалось в неправильном элементе
                    оглавления (возможно в результате смены дискеты).


     ПРОГРАММА: ИСПОЛЬЗОВАНИЕ FCB ДЛЯ СОЗДАНИЯ ФАЙЛА НА ДИСКЕ
     ________________________________________________________________

__________________________________________________________________________

        page    60,132
TITLE   FCBCREAT (EXE) Использование FCB для создания файла
;----------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
        DW      80 DUP(?)
STACKSG ENDS
;----------------------------------------------------------
DATASG  SEGMENT PARA 'Data'
RECLEN  EQU     32
NAMEPAR LABEL   BYTE            ;Список параметров:
MAXLEN  DB      RECLEN          ; макс.длина имени
NAMELEN DB      ?               ; число введенных символов
NAMEDTA DB      RECLEN DUP(' ') ; область передачи (DTA)

FCBREC  LABEL   BYTE            ;FCB для дискового файла
FCBDRIV DB      04              ; дисковод D
FCBNAME DB      'NAMEFILE'      ; имя файла
FCBEXT  DB      'DAT'           ; тип файла
FCBBLK  DW      0000            ; номер текущего блока
FCBRCSZ DW      ?               ; размер логической записи
FCBFLSZ DD      ?               ; размер файла (DOS)
        DW      ?               ; дата (DOS)
        DT      ?               ; зарезервировано (DOS)
FCBSQRC DB      00              ; номер текущей записи
        DD      ?               ; относительный номер

CRLF    DB      13,10,'$'
ERRCDE  DB      00
PROMPT  DB      'Name? ','$'
ROW     DB      01
OPNMSG  DB      '*** Open error ***',  '$'
WRTMSG  DB      '*** Write error ***', '$'
DATASG  ENDS
; ---------------------------------------------------------
CODESG  SEGMENT PARA 'Code'
BEGIN   PROC    FAR
        ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
        PUSH    DS
        SUB     AX,AX
        PUSH    AX
        MOV     AX,DATASG
        MOV     DS,AX
        MOV     ES,AX
        MOV     AX,0600H
        CALL    Q10SCR          ;Очистить экран
        CALL    Q20CURS         ;Установить курсор
        CALL    C10OPEN         ;Открыть, установить DTA
        CMP     ERRCDE,00       ;Есть место на диске?
        JZ      A20LOOP         ; да - продолжить,
        RET                     ; нет - вернуться в DOS
A20LOOP:
        CALL    D10PROC
        CMP     NAMELEN,00      ;Конец ввода?
        JNE     A20LOOP         ; нет - продолжить,
        CALL    G10CLSE         ; да - закрыть файл
        RET                     ; и вернуться в DOS
BEGIN   ENDP
;               Открытие дискового файла:
;               ------------------------
C10OPEN PROC    NEAR
        MOV     AH,16H          ;Функция создания файла
        LEA     DX,FCBREC
        INT     21H
        CMP     AL,00           ;Есть место на диске?
        JNZ     C20             ; нет - ошибка

        MOV     FCBRCSZ,RECLEN  ;Размер записи (EQU)
        LEA     DX,NAMEDTA      ;Загрузить адрес DTA
        MOV     AH,1AH
        INT     21AH
        RET
C20:
        LEA     DX,OPNMSG       ;Сообщение об ошибке
        CALL    X10ERR
        RET
C10OPEN ENDP
;               Ввод с клавиатуры:
;               -----------------
D10PROC PROC    NEAR
        MOV     AH,09           ;Функция вывода на экран
        LEA     DX,PROMPT       ;Выдать запрос
        INT     21H

        MOV     AH,0AH          ;Функция ввода
        LEA     DX,NAMEPAR      ;Ввести имя файла
        INT     21H
        CALL    E10DISP         ;Прокрутка на экране

        CMP     NAMELEN,00      ;Имя введено?
        JNE     D20             ; да - продолжить,
        RET                     ; нет - выйти
D20:
        MOV     BH,00           ;Заменить символ Return
        MOV     BL,NAMELEN
        MOV     NAMEDTA[BX],' ' ;Записать пробел
        CALL    F10WRIT         ;Вызвать
                                ; подпрограмму записи
        CLD
        LEA     DI,NAMEDTA      ;Очистить
        MOV     CX,RECLEN / 2   ; поле
        MOV     AX,2020H        ; имени
        REP STOSW
        RET                     ;Выйти
D10PROC ENDP
;               Прокрутка и установка курсора:
;               -----------------------------
E10DISP PROC    NEAR
        MOV     AH,09           ;Функция вывода на экран
        LEA     DX,CRLF         ;CR/LF
        INT     21H             ;Вызов DOS
        CMP     ROW,18          ;Последняя строка экрана?
        JAE     E20             ; да - обойти,
        INC     ROW             ; нет - увеличить строку
        RET
E20:
        MOV     AX,0601H        ;Прокрутка на 1 строку
        CALL    Q10SCR
        CALL    Q20CURS         ;Установить курсор
        RET
E10DISP ENDP
;               Запись на диск:
;               --------------
F10WRIT PROC    NEAR
        MOV     AH,15H          ;Функция записи
        LEA     DX,FCBREC
        INT     21H
        CMP     AL,00           ;Запись без ошибок?
        JZ      F20             ; да
        LEA     DX,WRTMSG       ; нет -
        CALL    X10ERR          ; выдать сообщение
        MOV     NAMELEN,00
F20:    RET
F10WRIT ENDP
;               Закрытие дискового файла:
;               ------------------------
G10CLSE PROC    NEAR
        MOV     NAMEDTA,1AH     ;Установить EOF
        CALL    F10WRIT
        MOV     AH,10H          ;Функция закрытия
        LEA     DX,FCBREC
        INT     21H
        RET
G10CLSE ENDP
;               Прокрутка экрана:
;               ----------------
Q10SCR  PROC    NEAR            ;AX уже установлен
        MOV     BH,1EH          ;Цвет желтый на синем
        MOV     CX,0000
        MOV     DX,184FH
        INT     10H             ;Прокрутка
        RET
Q10SCR  ENDP
;               Установка курсора:
;               -----------------
Q20CURS PROC    NEAR
        MOV     AH,02
        MOV     BH,00
        MOV     DL,00
        MOV     DH,ROW          ;Установить курсор
        INT     10H
        RET
Q20CURS ENDP
;               Вывод сообщения об ошибке на диске:
;               ----------------------------------
X10ERR  PROC    NEAR
        MOV     AH,09           ;DX содержит
        INT     21H             ; адрес сообщения
        MOV     ERRCDE,01       ;Установить код ошибки
        RET
X10ERR  ENDP

CODESG  ENDS
        END     BEGIN
__________________________________________________________________________

     Рис.16.1. Создание дискового файла.


     Программа, приведенная на рис.16.1, создает дисковый файл  по  имени,
которое вводится пользователем с клавиатуры.  Блок FCB (FCBREC)  в  данной
программе содержит следующие поля:

FCBDRIV   Программа должна создать файл на диске в дисководе 4 (или D).
FCBNAME   Имя файла - NAMEFILE.
FCBEXT    Тип файла - DAT.
FCBBLK    Начальное значение номера текущего блока - 0.
FCBRCSZ   Размер  записей   неопределен,   так   как   операция   открытия
          устанавливает в данном поле значение 128.
FCBSQRC   Начальное значение номера текущей записи - 0.

     В программе организованы следующие процедуры:

BEGIN     Инициализирует  сегментные  регистры,   вызывает   C10OPEN   для
          создания файла и установки адреса DTA для DOS,  вызывает D10PROC
Предыдущая страница Следующая страница
1 ... 39 40 41 42 43 44 45  46 47 48 49 50 51 52 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама