Условная генерация пользовательской ошибки

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

  • .ERRB (ERRIFB) и .ERRNB (ERRIFNB)
  • .ERRDEF (ERRIFDEF) и .ERRNDEF (ERRIFNDEF)
  • .ERRDIF (ERRIFDIF) и .ERRIDN (ERRIFIDN)
  • .ERRE (ERRIFE) и .ERRNZ (ERRIF)


Принцип их работы ясен, поэтому рассматривать их мы будем очень кратко. Заметим только, что как и директивы условной компиляции, использовать большинство директив условной генерации пользовательской ошибки можно как в макроопределениях, так и в любом месте программы.

 

ВВОД-ВЫВОД. ПРЕРЫВАНИЯ

 

Все устройства ЭВМ делят на внутренние и внешние. Внутренние устройства - это центральный процессор и оперативная память, а внешние - все остальные устройства (внешняя память, клавиатура, дисплей, принтер и т. д.). Под вводом-выводом понимается обмен информацией между ЦП и любым внешним устройством. Ввод - это передача данных в ЦП из внешнего устройства, а вывод - передача данных из ЦП во внешнее устройство. Передача информации между ЦП и внешними устройствами осуществляется через порты. Порт - это некоторый регистр размером в байт или слово, причем этот регистр находится вне ЦП, но не имеет отношения к обычным регистрам. Порты нумеруются, их номера от 0 до 0FFFFh. С каждым внешним устройством связан свой порт или несколько портов, их номера заранее известны.

Как ЦП, так и внешнее устройство может записывать информацию в порт и может считывать из него. Со стороны ЦП эти операции осуществляются с помощью следующих машинных команд:

- Чтение из порта (ввод): IN AL, n / IN AX, n

- Запись в порт (вывод): OUT n, AL / OUT n, AX

По команде IN в регистр AL(AX) переносится содержимое порта с номером n, а команда OUT реализует обратное действие: в порт с номером n записывает содержимое регистра AL(AX).

 

Пример:

 

MODEL SMALL

STACK 256

CODESEG

Start:

 

mov ax,@data; установка в ds адpеса

mov ds,ax; сегмента данных

 

in al,61H; получить текущее значение

or al,02H; установить второй бит

out 61H, al; вывести значение в порт

mov cx,9000H; количество циклов

delay:

loop delay; ждать

and al,0fdH; очистить второй бит

out 61H, al; вывести в порт

 

Exit:

mov ax, 4C00h

int 21h

 

End Start

 

 

Внешние устройства и аппаратные прерывания

 

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

 

Например, рассмотрим ситуацию, когда нажата клавиша на клавиатуре компьютера. Процессор должен временно прервать выполнение текущей задачи и отреагировать на нажатие клавиши. Затем он, возможно, возобновит выполнение прерванной задачи. Прерывание от клавиатуры относится к классу так называемых аппаратных, или асинхронных, прерываний. Бывают также и синхронные прерывания, которые происходят не в результате внешних событий, а при выполнении команд процессора. Например, синхронное прерывание происходит при попытке выполнить деление на ноль.

 

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

 

Получив по шине сигнал прерывания, процессор прерывает текущую работу и переключается на обработку прерывания. Текущее состояние процессора запоминается в аппаратном стеке. (Состояние процессора определяется набором его самых важных регистров, включающим, например, регистр PC и регистр флагов; конкретный набор запоминаемых в стеке регистров зависит от конструкции процессора.) Затем процессор переходит к выполнению специальной программы-обработчика прерывания. Эта программа определяется по номеру прерывания, выставленному внешним устройством на шине.

 

Во время выполнения обработчика прерывания другие прерывания запрещены. Программа обработки прерывания должна быть короткой и быстрой, чтобы по возможности не нарушить нормальную работу компьютера. Так, программа обработки прерывания от клавиатуры должна прочесть код нажатой или отпущенной клавиши, для этого процессор читает данные из портов ввода-вывода, соответствующих клавиатуре. (Чтение и запись в порты ввода-вывода также производятся через шину.) Затем команда, соответствующая нажатой или отпущенной клавише, ставится в очередь запросов к драйверу клавиатуры. На этом программа-обработчик прерывания от клавиатуры завершает свою работу. По завершению обработчика прерывания процессор восстанавливает свое состояние, которое было ранее запомнено в аппаратном стеке. После восстановления процессор продолжает работу с того места, на котором она была прервана.

 

Реально клавиатурная команда будет обработана, когда до нее дойдет очередь, т.е. только после выполнения всех команд, поступивших от клавиатуры ранее и сохраненных в очереди клавиатурного драйвера, а также поступивших ранее команд от других внешних устройств.

 

Команда INT прерывает обработку программы, передает управление в DOS или BIOS для определенного действия и затем возвращает управление в прерванную программу для продолжения обработки. Наиболее часто прерывание используется для выполнения операций ввода или вывода. Для выхода из программы на обработку прерывания и для последующего возврата команда INT выполняет следующие действия:

 

- уменьшает указатель стека на 2 и заносит в вершину стека содержимое флагового регистра;

- очищает флаги TF и IF;

- уменьшает указатель стека на 2 и заносит содержимое регистра CS в стек;

- уменьшает указатель стека на 2 и заносит в стек значение командного указателя;

- обеспечивает выполнение необходимых действий;

- восстанавливает из стека значение регистра и возвращает управление в прерванную программу на команду, следующую после INT.

 

Этот процесс выполняется полностью автоматически. Необходимо лишь определить сегмент стека достаточно большим для записи в него значений регистров.

 

ПРЕРЫВАНИЯ BIOS

 

В данном разделе приведены основные прерывания BIOS.

 

INT 05H. П е ч а т ь э к р а н а. Выполняет вывод содержимого экрана на печатающее устройство. Команда INT 05H выполняет данную операцию из программы, а нажатие клавишей Ctrl/PrtSc - с клавиатуры. Операция запрещает прерывания и сохраняет позицию курсора.

 

INT 10H. У п р а в л е н и е д и с п л е е м. Обеспечивает экранные и клавиатурные операции, детально описанные в гл.9.

 

INT 11H. З а п р о с с п и с к а п р и с о е д и н е н н о г о о б о р у д о в а н и я. Определяет наличие различных устройств в системе, результирующее значение возвращает в регистре AX. При включении компьютера система выполняет эту операцию и сохраняет содержимое AX в памяти по адресу шест.410. Значения битов в регистре AX:

 

Бит Устройство

 

15,14 Число подключенных принтеров.

13 Последовательный принтер.

12 Игровой адаптер.

11-9 Число последовательных адаптеров стыка RS232.

7,6 Число дискетных дисководов, при бите 0=1:

00=1, 01=2, 10=3 и 11=4.

5,4 Начальный видео режим:

00 = не используется,

01 = 40х25 плюс цвет,

10 = 80х25 плюс цвет,

11 = 80х25 черно-белый режим.

1 Значение 1 говорит о наличии сопроцессора.

0 Значение 1 говорит о наличии одного или более дисковых

устройств и загрузка операционной системы должна

осуществляться с диска.

 

INT 12H З а п р о с р а з м е р а ф и з и ч е с к о й п а м я т и.

Возвращает в регистре AX размер памяти в килобайтах, например, шест.200 соответствует памяти в 512 К. Данная операция полезна для выравнивания размера программы в соответствии с доступной памятью.

 

INT 13H. Д и с к о в ы е о п е р а ц и и в в о д а - в ы в о д а.

Обеспечивает операции ввода-вывода для дискет и винчестера.

 

INT 14H. У п р а в л е н и е к о м м у н и к а ц и о н н ы м

а д а п т е р о м. Обеспечивает последовательный ввод-вывод через коммуникационный порт RS232. Регистр DX должен содержать номер (0 или 1) адаптера стыка RS232. Четыре типа операции, определяемые регистром AH, выполняют прием и передачу символов и возвращают в регистре AX байт состояния коммуникационного порта.

 

INT 15H. К а с с е т н ы е о п е р а ц и и в в о д а - в ы в о д а

и с п е ц и а л ь н ы е ф у н к ц и и д л я к о м п ь ю т е р о в AT.

Обеспечивает операции ввода-вывода для кассетного магнитофона, а также расширенные операции для компьютеров AT.

 

INT 16H. В в о д с к л а в и а т у р ы. Обеспечивает три типа команд ввода с клавиатуры.

 

INT 17H. В ы в о д н а п р и н т е р. Обеспечивает вывод данных на печатающее устройство.

 

INT 18H. О б р а щ е н и е к BASIC, в с т р о е н н о м у в ROM.

Вызывает BASIC-интерпретатор, находящийся в постоянной памяти ROM.

 

INT 19H. П е р е з а п у с к с и с т е м ы. Данная операция при доступном диске считывает сектор 1 с дорожки 0 в область начальной загрузки в памяти (сегмент 0, смещение 7C00) и передает управление по этому адресу. Если дисковод не доступен, то операция передает управление через INT 18H в ROM BASIC. Данная операция не очищает экран и не инициализирует данные в ROM BASIC, поэтому ее можно использовать из программы.

 

INT 1AH. З а п р о с и у с т а н о в к а т е к у щ е г о

в р е м е н и и д а т ы. Считывает и записывает показание часов в соответствии со значением в регистре AH. Для определения продолжительности выполнения программы можно перед началом выполнения установить часы в 0, а после считать текущее время. Отсчет времени идет примерно 18,2 раза в секунду. Значение в регистре AH соответствует следующим операциям:

 

AH=00 Запрос времени. В регистре CX устанавливается старшая часть значения, а в регистре DX - младшая. Если после последнего запроса прошло 24 часа, то в регистре AL будет не нулевое значение.

AH=01 Установка времени. Время устанавливается по регистрам CX (старшая часть значения) и DX (младшая часть значения).

 

Коды 02 и 06 управляют временем и датой для AT.

 

INT 1FH. А д р е с т а б л и ц ы г р а ф и ч е с к и х с и м в о л о в. В графическом режиме имеется доступ к символам с кодами 128-255 в 1К таблице, содержащей по восемь байт на каждый символ. Прямой доступ в графическом режиме обеспечивается только к первым 128 ASCII-символам (от 0 до 127).

 

ПРЕРЫВАНИЯ DOS

 

Во время своей работы BIOS использует два модуля DOS: IBMBIO.COM и IBMDOS.COM. Так как модули DOS обеспечивают большое количество разных дополнительных проверок, то операция DOS обычно проще в использовании и менее машиннозависимы, чем их BIOS аналоги.

Модуль IBMBIO.COM обеспечивает интерфейс с BIOS низкого уровня. Эта программа выполняет управление вводом-выводом при чтении данных из внешних устройств в память и записи из памяти на внешние устройства.

Модуль IBMDOS.COM содержит средства управления файлами и ряд сервисных функций, таких как блокирование и деблокирование записей. Когда пользовательская программа выдает запрос INT 21H, то в программу IBMDOS через регистры передается определенная информация. Затем программа IBMDOS транслирует эту информацию в один или несколько вызовов IBMBIO, которая в свою очередь вызывает BIOS.

 

Как показано выше, прерывания от шест.20 до шест.62 зарезервированы для операций DOS. Ниже приведены наиболее основные из них:

 

INT 20H. З а в е р ш е н и е п р о г р а м м ы. Запрос завершает выполнение программы и передает управление в DOS. Данный запрос обычно находится в основной процедуре.

 

INT 21H. З а п р о с ф у н к ц и й DOS. Основная операция DOS, вызывающая определенную функцию в соответствии с кодом в регистре AH. Назначение функций DOS описано в следующем разделе.

 

INT 22H. А д р е с п о д п р о г р а м м ы о б р а б о т к и з а в е р ш е н и я з а д а ч и. (см.INT 24H).

 

INT 23H. А д р е с п о д п р о г р а м м ы р е а к ц и и н а Ctrl/Break. (см.INT 24H).

 

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

 

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

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

 

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

 

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

 

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

 

00 Завершение программы (аналогично INT 20H).

01 Ввод символа с клавиатуры с эхом на экран.

02 Вывод символа на экран.

03 Ввод символа из асинхронного коммуникационного канала.

04 Вывод символа на асинхронный коммуникационный канал.

05 Вывод символа на печать.

06 Прямой ввод с клавиатуры и вывод на экран.

07 Ввод с клавиатуры без эха и без проверки Ctrl/Break.

08 Ввод с клавиатуры без эха с проверкой Ctrl/Break.

09 Вывод строки символов на экран.

0А Ввод с клавиатуры с буферизацией.

0В Проверка наличия ввода с клавиатуры.

0С Очистка буфера ввода с клавиатуры и запрос на ввод.

0D Сброс диска.

0Е Установка текущего дисковода.

0F Открытие файла через FCB.

10 Закрытие файла через FCB.

11 Начальный поиск файла по шаблону.

12 Поиск следующего файла по шаблону.

13 Удаление файла с диска.

14 Последовательное чтение файла.

15 Последовательная запись файла.

16 Создание файла.

17 Переименование файла

18 Внутренняя операция DOS.

19 Определение текущего дисковода

1А Установка области передачи данных (DTA).

1В Получение таблицы FAT для текущего дисковода.

1С Получение FAT для любого дисковода.

21 Чтение с диска с прямым доступом.

22 Запись на диск с прямым доступом.

23 Определение размера файла.

24 Установка номера записи для прямого доступа.

25 Установка вектора прерывания.

26 Создание программного сегмента.

27 Чтение блока записей с прямым доступом.

28 Запись блока с прямым доступом.

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.

3D Открытие файла без использования FCB.

3E Закрытие файла без использования FCB.

3F Чтение из файла или ввод с устройства.

40 Запись в файл или вывод на устройство.

41 Удаление файла из каталога.

42 Установка позиции для последовательного доступа.

43 Изменение атрибутов файла.

44 Управление вводом-выводом для различных устройств.

45 Дублирование файлового номера.

46 "Склеивание" дублированных файловых номеров.

47 Получение текущего каталога.

48 Выделение памяти из свободного пространства.

49 Освобождений выделенной памяти.

4А Изменение длины блока выделенной памяти.

4В Загрузка/выполнение программы (подпроцесса).

4С Завершение подпроцесса с возвратом управления.

4D Получение кода завершения подпроцесса.

4Е Начальный поиск файла по шаблону.

4F Поиск следующего файла по шаблону.

54 Получение состояния верификации.

56 Переименование файла.

57 Получение/установка даты и времени изменения файла.

 

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

 

59 Получение расширенного кода ошибки.

5А Создание временного файла.

5В Создание нового файла.

5С Блокирование/разблокирование доступа к файлу.

62 Получение адреса префикса программного сегмента (PSP).

 

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: