Главная · Поиск книг · Поступления книг · 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 ... 65 66 67 68 69 70 71  72 73 74 75 76 77 78 ... 85

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

     INT 25H. А б с о л ю т н о е  ч т е н и е  с  д и с к а. См.гл.17.

     INT 26H. А б с о л ю т н а я  з а п и с ь  н а  д и с к. См.гл.17.

     INT 27H.З а в е р ш е н и е  п р о г р а м м ы, о с т а в л я ю щ е е
е е р е з е д е н т н о й.  Позволяет сохранить  COM-программу  в  памяти.
Подробно данная операция рассмотрена в  последующем  разделе  "Резидентные
программы".


     ФУНКЦИИ ПРЕРЫВАНИЯ DOS INT 21H
     ________________________________________________________________

     Ниже приведены базовые  функции  для  прерывания  DOS  INT  21H.  Код
функции устанавливается в регистре AH:

     00   Завершение программы (аналогично INT 20H).
     01   Ввод символа с клавиатуры с эхом на экран.
     02   Вывод символа на экран.
     03   Ввод символа из асинхронного коммуникационного канала.
     04   Вывод символа на асинхронный коммуникационный канал.
     05   Вывод символа на печать (гл.19).
     06   Прямой ввод с клавиатуры и вывод на экран.
     07   Ввод с клавиатуры без эха и без проверки Ctrl/Break.
     08   Ввод с клавиатуры без эха с проверкой Ctrl/Break.
     09   Вывод строки символов на экран (гл.8).
     0А   Ввод с клавиатуры с буферизацией (гл.8).
     0В   Проверка наличия ввода с клавиатуры.
     0С   Очистка буфера ввода с клавиатуры и запрос на ввод.
     0D   Сброс диска (гл.16).
     0Е   Установка текущего дисковода (гл.16).
     0F   Открытие файла через FCB (гл.16).
     10   Закрытие файла через FCB (гл.16).
     11   Начальный поиск файла по шаблону (гл.16).
     12   Поиск следующего файла по шаблону (гл.16).
     13   Удаление файла с диска (гл.16).
     14   Последовательное чтение файла (гл.16).
     15   Последовательная запись файла (гл.16).
     16   Создание файла (гл.16).
     17   Переименование файла (гл.16).
     18   Внутренняя операция DOS.
     19   Определение текущего дисковода (гл.16).
     1А   Установка области передачи данных (DTA).
     1В   Получение таблицы FAT для текущего дисковода.
     1С   Получение FAT для любого дисковода.
     21   Чтение с диска с прямым доступом  (гл.16).
     22   Запись на диск с прямым доступом (гл.16).
     23   Определение размера файла.
     24   Установка номера записи для прямого доступа.
     25   Установка вектора прерывания.
     26   Создание программного сегмента.
     27   Чтение блока записей с прямым доступом (гл.16).
     28   Запись блока с прямым доступом (гл.16).
     29   Преобразование имени файла во внутренние параметры.
     2А   Получение даты (CX-год,DН-месяц,DL-день).
     2В   Установка даты.
     2С   Получение времени (CH-час,CL-мин,DН-с,DL-1/100с).
     2D   Установка времени.
     2Е   Установка/отмена верификации записи на диск.

     Следующие расширенные функции возможны в DOS начиная с версии 2.0:

     2F    Получение адреса DTA в регистровой паре ES:BX.
     30    Получение номера версии DOS в регистре АХ.
     31    Завершение программы, после которого она остается резидентной в
           памяти.
     33    Проверка Ctrl/Break.
     35    Получение вектора прерывания (адреса подпрограммы).
     36    Получение размера свободного пространства на диске.
     38    Получение государственно зависимых форматов.
     39    Создание подкаталога (команда MKDIR).
     ЗА    Удаление подкаталога (команда RMDIR).
     3В    Установка текущего каталога (команда CHDIR).
     3C    Создание файла без использования FCB (гл.17).
     3D    Открытие файла без использования FCB (гл.17).
     3E    Закрытие файла без использования FCB (гл.17).
     3F    Чтение из файла или ввод с устройства (гл.8,17,19).
     40    Запись в файл или вывод на устройство (гл.8,17,19).
     41    Удаление файла из каталога (гл.17).
     42    Установка позиции для последовательного доступа (гл.17).
     43    Изменение атрибутов файла (гл.17).
     44    Управление вводом-выводом для различных устройств.
     45    Дублирование файлового номера.
     46    "Склеивание" дублированных файловых номеров.
     47    Получение текущего каталога (гл.17).
     48    Выделение памяти из свободного пространства.
     49    Освобождений выделенной памяти.
     4А    Изменение длины блока выделенной памяти.
     4В    Загрузка/выполнение программы (подпроцесса).
     4С    Завершение подпроцесса с возвратом управления.
     4D    Получение кода завершения подпроцесса.
     4Е    Начальный поиск файла по шаблону (гл.17).
     4F    Поиск следующего файла по шаблону (гл.17).
     54    Получение состояния верификации.
     56    Переименование файла (гл.17).
     57    Получение/установка даты и времени изменения файла.

     Следующие расширенные функции возможны в DOS начиная с версии 3.0:

     59    Получение расширенного кода ошибки.
     5А    Создание временного файла.
     5В    Создание нового файла.
     5С    Блокирование/разблокирование доступа к файлу.
     62    Получение адреса префикса программного сегмента (PSP).

     В техническом руководстве  по  DOS  представлены  подробные  описания
каждой функции.


     РЕЗИДЕНТНЫЕ ПРОГРАММЫ
     ________________________________________________________________

     Существует ряд распространенных фирменных программ (Prokey, Superkey,
Homebase, Sidekick  и  др.),  специально  разработанных  как  резидентные,
которые находятся в памяти во время работы других программ.  Эти программы
можно  активизировать  нажатием  определенных  клавиш.  Такие    программы
называются резидентными, и они загружаются в память сразу  после  загрузки
DOS перед выполнением обычных программ.
     Для  того,  чтобы  оставить  резидентную  COM-программу  в    памяти,
необходимо вместо команды RET или INT 20H для выхода использовать  команду
INT 27H  или  функцию  DOS  31Н.  Для  INT  27Н следует передать системе в
регистре DX размер программы:

               MOV     DX,prog-size
               INT     27H

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

          1)  секции,  переопределяющей  адреса   в    таблице    векторов
     прерываний;
          2)  процедуры,  выполняющейся  только  один  раз  при   загрузке
     программы и предназначенной для:

               -  замены  адреса  в  таблице  векторов    прерываний    на
          собственный адрес;
               - установки размера части программы, которая  должна  стать
          резидентной;
               - использования прерывания DOS для завершения  программы  и
          создания резидентной части по указанному размеру;

          3) процедуры, которая  остается  резидентной  и  активизируется,
     например, по вводу с клавиатуры или по сигналам таймера.

     Процедура инициализации должна создать необходимые условия для  того,
чтобы обеспечить работу резидентной программы, а затем - высшая жертва!  -
позволить  себе  быть  стертой  в  памяти.  В  результате  память    будет
распределена следующим образом:

               Таблица векторов прерываний
               IВМВIO.СОМ и IBMDOS.COM
               COMMAND.СОМ
               Резидентная часть программы - остается в памяти
               Инициализирующая часть программы - перекрывается  следующей
               программой
               Остальная часть доступной памяти

__________________________________________________________________________

TITLE   RESIDENT (COM) Резидентная программа для очистки
;                      экрана и установки цвета при нажатии
;                      Alt+Left Shift
;----------------------------------------------------------
INTTAB  SEGMENT AT 0H         ;Таблица векторов прерываний:
        ORG     9H*4          ; адрес для Int 9H,
KBADDR  LABEL   DWORD         ; двойное слово
INTTAB  ENDS
;----------------------------------------------------------
ROMAREA SEGMENT AT 400H       ;Область параметров BIOS:
        ORG     17H           ; адрес флага клавиатуры,
KBFLAG  DB      ?             ; состояние Alt + Shift
ROMAREA ENDS
;----------------------------------------------------------
CSEG    SEGMENT PARA          ;Сегмент кода
        ASSUME  CS:CS
        ORG     100H
BEGIN:  JMP     INITZ         ;Выполняется только один раз
KBSAVE  DD      ?             ;Для адреса INT 9 BIOS
;               Очистка экрана и установка цветов:
;               ---------------------------------
COLORS  PROC    NEAR          ;Процедура выполняется
        PUSH    AX            ; при нажатии Alt+Left Shift
        PUSH    BX
        PUSH    CX            ;Сохранить регистры
        PUSH    DX
        PUSH    SI
        PUSH    DI
        PUSH    DS
        PUSH    ES
        PUSHF
        CALL    KBSAV         ;Обработать прерывание
        ASSUME  DS:ROMAREA
        MOV     AX,ROMAREA    ;Установить DS для
        MOV     DS,AX         ; доступа к состоянию
        MOV     AL,KB  AG     ; Alt+Left Shift
        CMP     AL,00001010B  ;Alt+Left Shift нажаты?
        JNE     EXIT          ; нет - выйти
        MOV     AX,0600H      ;Функция прокрутки
        MOV     BH,61H        ;Установить цвет
        MOV     CX,00
        MOV     DX,18 FH
        INT     10H
EXIT:
        POP     ES            ;Восстановить регистры
        POP     DS
        POP     DI
        POP     SI
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        IRET                  ;Вернуться
COLORS  ENDP
;               Подпрограмма инициализации:
;               --------------------------
INITZE  PROC    NEAR            ;Выполнять только один раз
        ASSUME  DS:INTTAB
        PUSH    DS              ;Обеспечить возврат в DOS
        MOV     AX,INTTAB       ;Установить сегмент данных
        MOV     DS,AX
        CLI                     ;Запретить прерывания
                                ;Замена адреса обработчика:
        MOV     AX,WORD PTR KBADDR      ;Сохранить адрес
        MOV     WORD PTR KBSAVE,AX      ; BIOS
        MOV     AX,WORD PTR BADDR+2
        MOV     WORD PTR KBSAVE+2,AX
        MOV     WORD PTR KBADDR,OFFSET COLORS ;Заменить
        MOV     WORD PTR KBADDR+2,CS          ; адрес BIOS
        STI                      ;Разрешить прерывания
        MOV     DX,OFFSET INITZE ;Размер программы
        INT     27H              ;Завершить и остаться
INITZE  ENDP                     ; резидентом

CSEG    ENDS
        END     BEGIN
__________________________________________________________________________

     Рис.23.2 Резидентная программа


     Пример  на  рис.23.2  иллюстрирует  резидентную  программу,   которая
устанавливает цвет экрана при одновременном  нажатии  клавиш  Alt  и  Left
Shift. Основные моменты, представляющие интерес:
     Сегмент INTTAB определяет таблицу векторов  прерываний,  начинающуюся
по адресу  0,  а  точнее  -  адрес  элемента  для  прерывания  9  (ввод  с
клавиатуры), названный в программе KBADDR.
     Имя ROMAREA определяет сегмент, начинающийся по адресу 400Н, и в  нем
Предыдущая страница Следующая страница
1 ... 65 66 67 68 69 70 71  72 73 74 75 76 77 78 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама