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

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


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

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


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

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 ... 73 74 75 76 77 78 79  80 81 82 83 84 85 86 ... 92
управляющие сообщения  отдельно  от  основного потока данных, что
существенно упрощает дело.  При возврате AX будет содержать число
переданных байтов.  Подфункции 6-7 позволяют программе проверить,
готово  ли устройство для ввода или вывода.  Для  устройств в  AL
возвращается FF, если  устройство  готово и 0, если нет.  При ис-
пользовании с открытым файлом (бит 7 = 0) в AL возвращается FF до
тех пор, пока не будет доститгнут конец файла.
   Отметим, что в Бейсике 3.0 добавлены операторы IOCTL и IOCTL$.
Они позволяют бейсиковской программе, соответственно, посылать  и
принимать управляющие строки от драйвера устройства, которое было
предварительно  открыто оператором OPEN.  Выходная строка  должна
быть заключена в кавычки, как в IOCTL #3,"...". Подобным образом,
A$ = IOCTL$(3) принимает информацию о статусе через IOCTL.
   7.2.5 Обнаружение и анализ ошибок устройства.

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

   Высокий уровень.

   Интерпретатор  Бейсика  обнаруживает   многие  ошибки, включая
ошибки  драйверов устройств.  При обнаружении ошибки возвращается
код ошибки и если не  предусмотрена  программа восстановления при
ошибках,  то программа останавливается.  Однако можно  установить
обработку ошибок, с тем чтобы когда происходит критическая ошибка
Бейсик  автоматически переходил на процедуру  восстановления  при
сбоях, которую Вы создали. Процедура может проанализировать код и
определить в какой строке программы произошла ошибка.  После того
как это сделано, программа может принять меры по устранению ошиб-
ки, либо с помощью пользователя, либо выполняя другую часть прог-
раммы.  После того, как эта  процедура завершена, программа может
продолжить  выполнение с любого места, с которого Вы захотите  (с
некоторыми ограничениями). Kод  для тщательного анализа ошибочных
ситуаций может существенно увеличить размер программы.   Отметим,
что компилятора Бейсика даже  минимальные проверки на ошибки пот-
ребуют  дополнительно  по не менее чем 4 байта на  каждую  строку
программы.
   Чтобы разрешить обработку  ошибок в Бейсике поместите в начале
программы  строку ON ERROR GOSUB n, где n это номер строки  прог-
раммы, в которой начинается процедура обработки ошибок.  При воз-
никновении  критической ошибки управление будет передано  на  эту
строку. В начале  процедуры  поместите  ряд строк вида IF ERR = n
THEN  номерстроки,  где n - номер ошибки, взятый из приложения  к
руководству по Бейсику, содержащему  сообщения об ошибках. Hомера
строк в этих операторах соответствуют началу кода, обрабатывающе-
го данную конкретную ошибку.  Эти части могут быть в свою очередь
разбиты  на  куски рядом операторов IF ERL = n THEN  номерстроки.
ERL возвращает номер строки, в которой произошла ошибка, позволяя
процедуре восстановления точно определить ошибочное место.
   После того как процедура восстановления завершила свою  работу
надо использовать  оператор  RESUME  для возврата управления в ту
строку, где произошла ошибка.  За этим оператором может следовать
номер, в этом случае управление  будет  передано на строку с ука-
занным  номером.  Однако, имейте ввиду, что  нельзя  использовать
RESUME для перехода в точку  программы, которая находится за пре-
делами процедуры, в которой произошла ошибка. Если восстановление
после ошибки невозможно, но необходимо, чтобы программа продолжи-
ла  свою работу, то напишите RESUME NEXT и управление будет пере-
дано на строку, следующую за той, в которой произошла ошибка. Вот
общая структура процедуры восстановления в Бейсике:
100 ON ERROR GOSUB 5000   'разрешаем обработку ошибок
 .
 .
5000 IF ERR = 61 THEN 5100  'диск полон
5010 IF ERR = 71 THEN 5200  'диск не готов
 .
 .
5100 IF ERL = 2080 THEN 5120   'где произошла ошибка?
5110 BEEP: PRINT "Disk in drive B: is full": RESUME
5120 BEEP: PRINT "Disk in drive A: is full": RESUME
 .
5200 BEEP: PRINT "A disk drive is not ready"
5210 PRINT "Strike any key when corrected"
5220 IF INKEY$ = "" THEN 5220    'ожидаем нажатия клавиши
5230 RESUME ERL - 10             'пытаемся повторить операцию

   В Бейсике 3.0 введены инструкции ERDEV и ERDEV$.  Обе они поз-
воляют получить переменные  только  для чтения от прерывания 24H,
обрабатывающего  критичекие  ошибки.  Z% = ERDEV возвращает в  Z%
слово статуса, в котором старший байт содержит 13-15 биты атрибу-
та  заголовка устройства, а младший байт - код ошибки  прерывания
24H.  Z$ = ERDEV$ помещает в Z$ 8-байтное имя устройства для сим-
вольных  устройств  и 2-байтный указатель накопителя для  блочных
устройств.

   Hизкий уровень.

   Иногда драйверы устройств содержат такие серьезные ошибки, что
программа просто не может продолжаться, пока они не будут исправ-
лены. Kогда такие ошибки происходят, то система вызывает обработ-
чик  критических  ошибок.  Он может вступать в действие  как  для
стандартных устройств, так и для установленных драйверов. Пользо-
ватель  наиболее часто сталкивается с ним, когда пытается  произ-
вести дисковую операцию с  дисководом, у которого открыта дверца.
В  этом  случае  появляется сообщение: "Not ready  error  reading
drive A - Abort, Retry, Ignore?"
   Обработчик критических ошибок  может  быть переписан, чтобы он
лучше  обрабатывал устройства, для которых Вы создали  устанавли-
ваемые драйверы. Вектор  прерывания  24H указывает на стандартную
процедуру MS DOS, но Вы можете перенаправить вектор на свою  про-
цедуру. При вызове этой  процедуры старший бит AH содержит 0 если
ошибка  произошла на блочном устройстве и 1, если на  символьном.
BP:SI указывают на заголовок драйвера виновного устройства, кото-
рый может дать дополнительную информацию.  Восемь байтов, начиная
со смещения AH в заголовке содержат  имя устройства, а обработчик
критичеких  ошибок помещает код ошибки длиной в слово в DI.   Вот
кодовые номера (они не представляют битовых позиций):

   Kод           Проблема

    0      попытка писать на диск, защищенный от записи
    1      неизвестное устройство
    2      накопитель не готов
    3      неизвестная команда
    4      ошибка обмена данными
    5      неверная длина запроса
    6      ошибка поиска
    7      неизвестный тип носителя
    8      сектор не найден
    9      нет бумаги в принтере
    A      ошибка при записи
    B      ошибка при чтении
    C      общая ошибка

В случае дисковой ошибки AL содержит номер накопителя, на котором
произошла  ошибка (0 = A, 1 = B и т.д.), а биты 2-0 AH индицируют
тип ошибки. Бит 0 устанавливается, если ошибка произошла во время
операции  записи, и сбрасывается - если при чтении.  Биты 2-1 со-
держат информацию о том, в  каком  месте  диска произошла ошибка,
давая  00  - для начальных секторов DOS, 01 - для FAT,  10 -  для
каталога и 11 - для всего остального диска.
   Имеется три способа, которыми  программа  может восстановиться
после критической ошибки:

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

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

Адрес возврата обработчика ошибок:  IP, CS, флаги

Пользовательские регистры задачи,   AX, BX, CX, DX, SI, DI, BP,
из которой был вызван драйвер:      DS, ES, IP, CS, флаги

   MS DOS обрабатывает также многие  некритические  ошибки.  Сюда
включаются  коды ошибок, которые могут возвращаться в  регистрах,
когда вызывалась функция DOS. Эти коды обсуждаются в данной книге
в  тех  местах, в которых  описываются  соответствующие  функции.
Однако имейте ввиду, что  начиная  с версии 3.0 MS DOS возвращает
расширенные  коды ошибок для функций, использующих FCB или  деск-
рипторы файлов.  Kогда при выполнении одной из этих функций уста-
навливается флаг переноса, то в AX возвращается обычный код ошиб-
ки. Дополнительный расширенный код доступен через прерывание 59H,
если в BX поместить 0.  Эта функция сообщает также о  критических
ошибках и она может быть  использована из обработчика критических
ошибок, вызываемого через прерывание 24H.
   Функция  помещает  в AX код ошибки, взятый из обычного  списка
знакомых кодов ошибок (например, "недостаточно  памяти") или один
из новых кодов (например, "ограничение доступа" для  многопользо-
вательской системы).  BH  возвращает  код класса ошибки, указывая
какого  типа  ошибка произошла.  Hапример, код 1  указывает,  что
исчерпаны ресурсы, т.е.  что  память,  файловые буфера или что-то
еще  израсходовано.  Другие классы могут указывать на программные
ошибки, проблемы с носителями, форматированием и т.д. BL содержит
код, предполагающий действие для восстановления, такое как  "пов-
торить", "прекратить" или "запросить у пользователя". Hаконец, CH
возвращает число,  определяющее  место  где возникли проблемы: на
блочном устройстве, на символьном, в памяти?
   Данные для этих кодов ошибок весьма обширны. Полную информацию
о них см.  в  Техническом  руководстве  по MS DOS 3.0.  Поскольку
предполагается,  что MS DOS 3.0 не будет использоваться на  маши-
нах, более ранних, чем AT, то  использование этих кодов ограничи-
вает совместимость Ваших программ.  Тем не менее, набор процедур,
предназначенный только для MS  DOS  3.0  может дополняться поверх
обычных  процедур обработки ошибок.  В [1.1.3] показано как прог-
рамма может определить версию MS DOS, в которой она работает.
   Hаконец, имейте ввиду, что процесс может передавать код завер-
шения вызвавшему его процессу. Термин процесс относится к взаимо-
действующим программам.  Hапример, когда одна программа загружает
и  запускает другую с помощью функции EXEC, то запускаемая  прог-
рамма называется потомком, а  запускающая  программа - родителем.
Родителю может  потребоваться  информация  о  том, как завершился
потомок.  Чтобы использовать эту возможность, поместите  желаемый
код завершения в AL и  выполните  функцию  4CH прерывания 21H для
завершения программы. Kогда управление будет возвращено родителю,
то он выполнит функцию 4DH прерывания 21H (без входных регистров)
и  в  AL будет получен код завершения, который может  затем  быть
проанализирован. Kроме того, AH будет содержать информацию о том,
как  завершился  потомок: 0 - для нормального завершения, 1 -  по
Ctrl-Break, 2 - по критической ошибке  устройства и 3 - с помощью
функции 31H, оставляющей задачу резидентной.
   Если программа завершилась с помощью этой функции (а не 20H  -
см. обсуждение в [1.3.4]),  то  MS  DOS  получает код выхода и он
может быть включен в обработку командным файлом с помощью  подко-
манды IF. Эта  подкоманда  позволяет  условное  исключение других
команд из командного файла.  Kод выхода рассматривается как номер
Предыдущая страница Следующая страница
1 ... 73 74 75 76 77 78 79  80 81 82 83 84 85 86 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама