Главная · Поиск книг · Поступления книг · 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 ... 47 48 49 50 51 52 53  54 55 56 57 58 59 60 ... 85


     Программа выполняет в основном те же функции, что и  DOS  TYPE,  т.е.
выводит на экран каждую запись до  символов  "возврат  каретки"  и  "конец
строки"  (CR/LE).  Прокрутка  содержимого  экрана  (скроллинг)    вызывает
некоторые проблемы.  Если в программе не будет  предусмотрено  специальной
проверки на конец экрана, то вывод новых строк будет осуществляться поверх
старых и при короткой длине старые  символы  будут  оставаться  справа  от
новой строки.  Для правильной прокрутки необходимо подсчитывать  строки  и
контролировать достижение конца экрана.  Так как строки ASCII-файла  имеют
переменную длину, то следует определять конец каждой  строки  прежде,  чем
выводить ее на экран.
     Рассматриваемая программа считывает полный сектор  данных  в  область
SECTOR.  Процедура G10XFER передает данные побайтно из  области  SECTOR  в
область DISAREA, откуда они будут выдаваться  на  экран.  При  обнаружении
символа "конец строки", процедура выводит  на  экран  содержимое  DISAREA,
включая "конец строки". (Экран дисплея принимает также  символы  табуляции
(шест.09) и автоматически устанавливает курсор в следующую справа  позицию
кратную 8).
     В  программе  необходимо  проверять  конец  сектора  (для  считывания
следующего) и конец области вывода.  Для стандартных  ASCII-файлов,  таких
как  ASM-файлы,  каждая  строка  имеет  относительно  короткую  длину    и
гарантировано завершается парой символов CR/LF.  Нетекстовые файлы,  такие
как EXE или OBJ, не имеют строк и поэтому рассматриваемая программа должна
проверять достижение конца области DISAREA во избежание  разрушения.  Хотя
программа предназначена для вывода на экран только ASCII-файлов, она имеет
проверку для страховки от всяких неожиданных несимвольных файлов.
     Процедура G10XFER выполняет следующее:

1.   Инициализирует адрес области SECTOR.
2.   Инициализирует адрес области DISAREA.
3.   При достижении конца области SECTOR  считывает  следующий  сектор.  В
     случае конца файла,  завершает работу программы, иначе инициализирует
     адрес области SECTOR.
4.   При достижении конца области DISAREA вставляет символы CR/LF, выводит
     строку на экран и инициализирует адрес DISAREA.
5.   Переписывает символ из области SECTOR в область DISAREA.
6.   По символу "конец файла" (шест.1A) завершает работу программы.
7.   По символу  "конец  строки"  (шест.OA)  выводит  на  экран  строку  и
     переходит на п.2, по другим символам идет на п.3.

     Попробуйте выполнить эту программу  в  отладчике  DEBUG.  При  каждом
вводе с диска просмотрите содержимое области ввода и обратите внимание  на
то, как DOS форматирует записи. Для улучшения данной программы организуйте
вывод на экран запроса для указания пользователем имени и типа файла.


     ДРУГИЕ ДИСКОВЫЕ ФУНКЦИИ В РАСШИРЕННОЙ ВЕРСИИ DOS
     ________________________________________________________________

       Получение размера свободного дискового пространства: шест.36
      --------------------------------------------------------------
     Данная функция выдает информацию о дисковой  памяти.  Для  выполнения
функции необходимо загрузить в регистр DL номер  дисковода  (0  -  текущий
дисковод, 1 - A, 2 - B и т.д.):

               MOV  AH,36H    ;Запрос на
               MOV  DL,0      ; текущий дисковод
               INT  21H       ;Вызов DOS

     При указании неправильного номера  дисковода  операция  возвращает  в
регистре AX шест.FFFF, иначе следующие значения:

               в AX число секторов на кластер,
               в BX число доступных кластеров,
               в CX число байтов на сектор,
               в DX общее число кластеров на дисководе.

     В версии DOS младше 2.0 для получения информации  о  дисковой  памяти
следует использовать функцию шест.1B (получить информацию из таблицы FAT).


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

               MOV  AH,41H         ;Запрос на удаление
               LEA  DX,PATHNAM     ;ASCIIZ-строка
               INT  21H            ;Вызов DOS

     В случае ошибки в регистре AX возвращается код 02  (файл  не  найден)
или 05 (нет доступа).


                 Управление файловым указателем: шест.42
                -----------------------------------------
     Система DOS имеет файловый  указатель,  который  при  открытии  файла
устанавливается в 0 и увеличивается на 1  при  последовательных  операциях
записи или считывания.  Для доступа к любым  записям  внутри  файла  можно
менять файловый указатель с помощью функции шест.42, получая в  результате
прямой доступ к записям файла.
     Для установки файлового указателя необходимо поместить в  регистр  BX
файловый номер и в регистровую пару CX:DX требуемое смещение в байтах. Для
смещений до 65.535 в регистре CX устанавливается 0, а в DX -  смещение.  В
регистре AL должен быть установлен один из кодов, который определяет точку
отсчета смещения:

     0  - смещение от начала файла.
     1  - смещение текущего значения файлового  указателя,  которое  может
          быть в любом месте, включая начало файла.
     2  - смещение от конца файла.  Размер файла (и следовательно смещение
          до конца файла)  можно определить,  установив  регистровую  пару
          CX:DX в 0 и используя код 2 в регистре AL.

     В следующем примере устанавливается файловый  указатель  на  смещение
1024 байта от начала файла:

               MOV  AH,42H         ;Установка указателя
               MOV  AL,00          ; от начала файла
               LEA  BX,HANDLE1     ;Установка файлового номера
               MOV  CX,00          ;
               MOV  DX,1024        ;Смещение 1024 байта
               INT  21H            ;Вызов DOS
               JC   error

     Правильно выполненная операция сбрасывает флаг CF и возвращает  новый
указатель в регистровой паре DX:AX.  Неправильная  операция  устанавливает
флаг CF в 1 и возвращает в регистре AX код 01 (ошибка кода отсчета) или 06
(ошибка файлового номера).


                 Проверка или изменение атрибута: шест.43
                ------------------------------------------
     Для проверки или изменения  файлового  атрибута  в  оглавлении  диска
используется  функция  шест.43H.  При  этом  в  регистре  DX  должен  быть
установлен адрес ASCIIZ строки.  Для проверки атрибута регистр  AL  должен
содержать 00. Для изменения атрибута регистр AL  должен  содержать  01,  а
регистр CX -  новое  значение  атрибута.  Следующий  пример  устанавливает
нормальный атрибут:

               MOV  AH,43H         ;Запрос на установку
               MOV  AL,01          ; нормального
               MOV  CX,00          ; атрибута
               LEA  DX,PATHNM2     ;ASCIIZ-строка
               INT  21H            ;Вызов DOS

     В случае проверки функция возвращает текущий атрибут файла в регистре
CX.  В случае изменения функция устанавливает в  соответствующем  элементе
оглавления атрибут из регистра  CX.  Неправильная  операция  возвращает  в
регистре AX коды ошибок 02, 03 или 05.


                   Получить текущее оглавление: шест.47
                  --------------------------------------
     Определение текущего оглавления для любого дисковода осуществляется с
помощью функции шест.47. При этом  необходимо  определить  область  памяти
достаточно большую, чтобы содержать  пути  доступа  максимальной  длины  и
загрузить адрес этой области в регистр DX.  Регистр  DL  должен  содержать
номер дисковода: 0 - текущий, 1 - A, 2 - B и т.д.  В результате выполнения
операция помещает в область памяти  имя  текущей  директории  (без  номера
дисковода), например, в следующем виде:

               ASSEMBLE\EXAMPLES

     Нулевой байт (шест.00) идентифицирует  конец  составного  имени  пути
доступа.  Для корневой директории возвращаемое значение состоит только  из
одного байта - шест.00. Таким образом  можно  получить  текущее  имя  пути
доступа для любого файла в подоглавлении. Пример на рис.17.5 демонстрирует
использование данной функции.

__________________________________________________________________________

TITLE   GETPATH (COM)   Получить текущий каталог
CODESG  SEGMENT PARA 'Code'
        ASSUME  CS:CODESG,DS:CODESG,ES:CODESG
        ORG     100H
BEGIN:  JMP     SHORT MAIN
; -----------------------------------------------
PATHNAM DB      65 DUP(' ')     ;Имя текущего пути доступа
; -----------------------------------------------
MAIN    PROC    NEAR
        MOV     AH,19H          ;Определить текущий диск
        INT     21H
        ADD     AL,41H          ;Заменить шест.номер
        MOV     DL,AL           ; на букву: 0=A, 1=B ...
        CAL     B10DISP         ;Выдать номер дисковода,
        MOV     DL,':'
        CAL     B10DISP         ; двоеточие,
        MOV     DL,'\'
        CAL     B10DISP         ; обратную косую

        MOV     AH,47H          ;Получить текущий каталог
        MOV     DL,00
        LEA     SI,PATHNAM
        INT     21H
A10LOOP:
        CMP     BYTE PTR [SI],0 ;Конец имени пути доступа
        JE      A20             ; да - выйти
        MOV     AL,[SI]         ;Выдать на экран
        MOV     DL,AL           ; имя пути доступа
        CALL    B10DISP         ; побайтно
        INC     SI
        JMP     A10LOOP
A20:    RET                     ;Выход в DOS
MAIN    ENDP

B10DISP PROC    NEAR
        MOV     AH,02           ;в DL - адрес элемента
        INT     21H             ;Функция вывода на экран
        RET
B10DISP ENDP

CODESG  ENDS
        END     BEGIN
__________________________________________________________________________

     Рис.17.5. Получить текущий каталог.


                Поиск файлов по шаблону: шест.4E и шест.4F
               --------------------------------------------
     Данные функции аналогичны функциям шест. 11 и 12 базовой версии  DOS.
Функция 4E используется для начала поиска в оглавлении, а функция 4F - для
продолжения.  Для начала поиска в регистр DX  необходимо  загрузить  адрес
ASCIIZ-строки, содержащей имя пути доступа и шаблон поиска.  Шаблон поиска
может включать в себя символы ? и *.  В регистре CX должно  быть  значение
атрибута в любой комбинации битов (нормальный, оглавление, спрятанный  или
системный).

               MOV  AH,4EH         ;Запрос на начало поиска
               MOV  CX,00H         ;Нормальный атрибут
               LEA  DX,PATHNM1     ;ASCIIZ-строка
               INT  21H            ;Вызов DOS

     Если операция находит файл,  удовлетворяющий  шаблону  поиска,  то  в
текущий буфер DTA в FCB заполняется следующей информацией:

     00 - резервировано DOS для последующего поиска
     21 - атрибут файла
     22 - время файла
     24 - дата файла
     26 - размер файла: младшее слово, затем старшее слово
     30 - имя и тип в виде 13-байтовой ASCIIZ строки, завершаемой шест.00.

     В случае ошибки в регистре AX возвращается код 02 (не найдено) или 18
(нет больше файлов). Для продолжения поиска файлов (после функции шест.4E)
используется  функция  4F.  Между  этими  функциями  не  следует  нарушать
содержимое DTA.

               MOV  AH,4FH         ;Запрос на продолжение поиска
               INT  21H            ;Вызов DOS

     Единственно возможный код в регистре AX - 18 (нет больше файлов). Обе
рассмотренные функции не меняют состояние флага CF.


                      Переименование файла: шест.56
                     -------------------------------
     Для переименования файла используется функция  шест.56.  При  этом  в
регистр DX должен быть загружен  адрес  ASCIIZ-строки,  содержащей  старые
значения дисковода, пути доступа, имени и типа файла, а в  регистр  DI  (в
Предыдущая страница Следующая страница
1 ... 47 48 49 50 51 52 53  54 55 56 57 58 59 60 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама