Функции bios int 11h проверка оборудования


Содержание

Векторы прерываний BIOS

При инициализации таблицы прерываний BIOS отвечает за корректное заполнение части векторов, которые имеют отношение к аппаратным средствам компьютера и сервисов BIOS. На часть из них могут быть просто установлены заглушки — вектор ссылается на код обработчика, который содержит единственную инструкцию возвращения из прерывания, — IRET. BIOS будет инициализировать векторы внутренних прерываний процессора (исключений), которые могут возникнуть в реальном режиме работы (об исключении защищенного режима в основном заботится соответствующая операционная система). К внутренним прерываниям относятся следующие (INT 70h — INT 77h — только для AT):

заглушки — вектор ссылается на код обработчика, который содержит единственную инструкцию возвращения из прерывания, — IRET. BIOS будет инициализировать векторы внутренних прерываний процессора (исключений), которые могут возникнуть в реальном режиме работы (об исключении защищенного режима в основном заботится соответствующая операционная система). К внутренним прерываниям относятся следующие (INT 70h — INT 77h — только для AT):

  • — INT 00h — деление на 0
  • — INT 01h — внутренний режим.
  • — INT 03h — точка остановки.
  • — INT 04h — переполнение.
  • — INT 06h — недопустимая команда 286+.
  • — INT 07h — вызов отсутствующего NPU.

Аппаратные прерывания включают следующие (INT 70h-77h — только для AT): — INT 02h — немасковое прерывание.

  • — INT 08h — таймер 8253/8254.INT 09h — клавиатура.
  • — INT 0Ah-0Dh — IRQ2-IRQ5.
  • — INT 0Eh — IRQ6 — контроллер гибких дисков.
  • — INT OFh — IRQ7.
  • — INT 70h — CMOS-таймер.
  • — INT 71h — IRQ9 (перенаправлено на INT 0Ah).
  • — INT 72h-74h — IRQ10-IRQ12.
  • — INT 75Ь — IRQ13 — выключение сопроцессора.
  • — INT 76h — IRQ14 — контроллер жёстких дисков.
  • — INT 77h — IRQ15.
  • — Векторы прерываний, которые обеспечивают вызовы функций BIOS (сервисов), включают следующие:
  • — — INT 05h — печать экрана.
  • — — INT 10h — видеосервис.
  • — — INT 11h — список оборудования.
  • — — INT 12h — размер непрерывной памяти
  • — — INT 13h — дисковый ввод-вывод.INT 14h — обслуговування СОМ-портов.
  • — INT 15h — АТ-функции (системний сервис).
  • — INT 16h — клавиатурный ввод-вывод.
  • — INT 17h — обслуживание lpt-портов
  • — INT 18h — ROM-Basic.
  • — INT 19h — начальная загрузка (Bootstrap).
  • — INT 1ah — системное время и 16-битни вызовы сервисов PCI.
  • — INT 1bh — обработчик ctrl+break.
  • — INT 1ch — предназначенная для пользователя процедура, которая вызывается обработчиком INT 08h (User Timer Interrupt).
  • — INT 33h — поддержка мыши.
  • — INT 67h — ems-функции.

Несколько векторов используются в качестве указателей на системные таблицы. К векторам-указателям относятся следующие:

  • — INT 1dh — видеопараметры.
  • — INT 1eh — параметры дискет.
  • — INT 1fh — знакогенератор CGA.
  • — INT 41h — параметры HDD 0.
  • — INT 46h — параметры HDD 1.
  • — INT 43h — знакогенератор EGA.
  • — INT 4ah — будильник пользователя.

Как видно из приведенных списков, большинство векторов BIOS налагаются на область векторов 00-1fh, зарезервированную фирмой Intel под внутренние прерывания и исключения процессоров. Хотя во времена 8086 из них использовалось совсем малое количество, зарезервированной была объявлена вся указанная область. Однако творцы IBM PC «влезли» в эту область, что усложнило жизни системных программистов, которые работают с более щедрыми на исключение современными процессорами.

1. Внутренняя организация MS-DOS

Дистрибутив операционной системы MS-DOS состоит, в зависимости от версии, из одной или нескольких дискет. На них расположены файлы собственно операционной системы IO.SYS, MSDOS.SYS, командный процессор COMMAND.COM, файлы внешних команд операционной системы (FORMAT, FDISK и т.п.), драйверы и другие файлы.

Файл IO.SYS содержит расширение базовой системы ввода/вывода и является интерфейсом между операционной системой и BIOS. Расширение используется операционной системой для взаимодействия с аппаратурой компьютера и BIOS.

Файл MSDOS.SYS является в некотором смысле набором программ обработки прерываний, в частности прерывания INT 21H. Это тело операционной системы.

Командный процессор COMMAND.COM предназначен для организации диалога с оператором. Он анализирует вводимые оператором команды и организует их выполнение. Так называемые внутренние команды (DIR, COPY и т.д.) обрабатываются именно командным процессором. Программист имеет возможность написать свой собственный командный процессор и подключить его вместо стандартного. Новый командный процессор должен выполнять все функции, которые раньше выполнял стандартный COMMAND.COM.

Драйверы (обычно это файлы, имеющие расширение имени .SYS) представляют собой программы, обслуживающие различную аппаратуру. Эти программы имеют специальный формат и будут подробно описаны в книге. Применение драйверов легко решает проблемы использования новой аппаратуры — достаточно написать для нового устройства драйвер и подключить его к операционной системе. Прикладные программы взаимодействуют с устройствами через драйвер, поэтому они не будут меняться при изменениях в аппаратуре. Например, новое дисковое устройство может иметь другое количество дорожек и секторов, другие управляющие команды. Все это учитывается драйвером, а прикладная программа будет работать с новым диском как и раньше, используя прерывания MS-DOS.

Файлы внешних команд операционной системы содержат программы-утилиты для выполнения разнообразных операций, таких как форматирование дисков, сортировка файлов, печати текстов и других.

Немного об утилитах, предназначенных для подготовки дисков и дискет.

Файлы операционной системы выделяются своим особым расположением на диске (кроме COMMAND.COM) — эти файлы должны находиться в специально отведенном для них месте. Если вам нужно подготовить дискету как системную (т.е. такую, с которой можно загружать операционную систему), для переноса файлов операционной системы следует использовать специальные утилиты.

Самый простой способ подготовки системной дискеты — использовать команду FORMAT с опцией /S, например:

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

Если вы собираетесь обновить версию операционной системы (например, вместо MS-DOS 3.30 установить MS-DOS 4.01), не обязательно заново переформатировать весь диск. Загрузив новую версию с дискеты, для переноса новых системных файлов используйте команду SYS:

Файл COMMAND.COM скопируйте обычным способом.

Если вам надо сделать дискету системной, а ее форматирование нежелательно (дискета содержит важную информацию), воспользуйтесь программой Norton Disk Doctor или аналогичной. Программа освободит место в начале диска для операционной системы, переписав располагавшиеся там данные на свободное место в конце дискеты, затем запишет системные файлы и даже скопирует файл COMMAND.COM.

Утилита FDISK предназначена для подготовки к работе жесткого диска. Она разбивает диск на участки, называемые разделами.

На одном физическом диске могут быть разделы, принадлежащие разным операционным системам. Один из разделов — активный, операционная система загружается из активного раздела.

Для MS-DOS утилита FDISK позволяет создать первичный и вторичный разделы. В первичном разделе располагается системный диск C:, с которого выполняется загрузка операционной системы, вторичный раздел может быть разделен на логические диски (D:, E:, F: и т.д.). Диски, располагающиеся во вторичном разделе, не могут быть системными.

Заметим, что только MS-DOS версии 4.01, 5.0 и Compaq DOS 3.31 позволяют создавать логические диски размером более 32 мегабайт. Это связано с тем, что другие версии DOS используют 16-разрядную адресацию секторов диска, что недостаточно для дисков больших размеров.

Очень часто вместо утилиты FDISK для подготовки жесткого диска используются диск-менеджеры. Это такие программы, как Advanced Disk Manager, Speed Stor и т.д. Используя свои собственные форматы разделов и таблиц разделов (и свои драйверы дисковых устройств), диск-менеджеры предоставляют такие дополнительные возможности, как защита логического диска от записи или организация парольной защиты данных на диске, создание логических дисков размером более 32 мегабайт.

Однако не всегда применение диск-менеджеров может привести к желаемому результату. Защита от несанкционированного доступа часто легко преодолевается, мощные ситемы защиты сильно привязаны к конкретной версии операционной системы (например, WatchDog, очень мощная система защиты, требует только DOS версии 3.20).

Кроме того, драйверы, используемые диск-менеджерами могут замедлить работу дисковой подсистемы компьютера.

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

Перейдем к процедуре начальной загрузки операционной системы.

При включении питания компьютера управление передается базовой системе ввода/вывода, BIOS.Она выполняет проверку аппаратных узлов компьютера, формирует начальную часть таблицы векторов прерываний, инициализирует устройства и начинает процесс загрузки операционной системы.

Загрузка начинается с того, что BIOS делает попытку прочитать самый первый сектор дискеты, вставленной в дисковод А: (на загрузочной дискете этот сектор содержит загрузчик операционной системы). Если в дисковод вставлена системная дискета, с нее считывается загрузчик и ему передается управление.

Если дискета не системная, т.е. не содержит загрузочной записи, на экран выдается сообщение с просьбой заменить дискету.

Если же дискеты в дисководе А: вообще нет, то BIOS читает основную загрузочную запись диска С: (Master Boot Record). Обычно это самый первый сектор на диске. Управление передается загрузчику, который находится в этом секторе. Загрузчик анализирует содержимое таблицы разделов (она также находится в этом секторе), выбирает активный раздел и читает загрузочную запись этого раздела. Загрузочная запись активного раздела (Boot Record) аналогична загрузочной записи, находящейся в первом секторе системной дискеты.

Загрузочная запись активного раздела считывает с диска файлы IO.SYS и MSDOS.SYS (именно в этом порядке). Затем считываются и загружаются резидентные драйверы. Начинается формирование связанного списка драйверов устройств. Анализируется содержимое файла CONFIG.SYS, загружаются описанные в этом файле драйверы. Сначала загружаются драйверы, описанные параметром DEVICE, затем (только в MS-DOS версии 4.х и 5.0) резидентные программы, указанные операторами INSTALL. После этого считывается командный процессор и ему передается управление.

Командный процессор состоит из трех частей — резидентной, инициализирующей и транзитной. Первой загружается резидентная часть. Она обрабатывает прерывания INT 22H, INT 23H, INT 24H, управляет загрузкой транзитной части. Эта часть командного процессора обрабатывает ошибки MS-DOS и выдает запрос пользователю о действиях при обнаружении ошибок.

Инициализирующая часть используется только в процессе загрузки операционной системы. Она определяет начальный адрес, по которому будет загружаться пользовательская программа и инициализирует выполнение файла AUTOEXEC.BAT.

Транзитная часть командного процессора располагается в старших адресах памяти. В этой части находятся обработчики внутренних команд MS-DOS и интерпретатор командных файлов с расширением имени .BAT. Транзитная часть выдает системное приглашение (например, А:> ), ожидает ввода команды оператора с клавиатуры или из пакетного файла и организует их выполнение.

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

Для того чтобы правильно работать с системным программным и аппаратным обеспечением, нужно четко представлять себе механизм взаимодействия прикладной программы с компьютером. На рис. 1.1 показаны функциональные связи программы с программно-аппаратным обеспечением IBM PC.

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

  • файловая система;
  • система управления памятью;
  • система управления программами;
  • система связи с драйверами устройств;
  • система обработки ошибок;
  • службу времени;
  • систему ввода/вывода консоли оператора.

Эти подсистемы общаются с аппаратурой через BIOS, драйверы или напрямую. Прикладное программное обеспечение может вызывать подсистемы DOS, работать с BIOS или непосредственно с аппаратурой. Обратите, однако, внимание на то, что прикладные программы могут обращаться к драйверам только через соответствующую подсистему DOS.

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

Рассмотрим подсистемы DOS отдельно.

Файловая система.

Файловая система является одной из важнейших подсистем DOS. Она используется как в процессе загрузки операционной системы, так и в процессе ее работы. Сама операционная система записана на системном диске в виде файлов (IO.SYS, MSDOS.SYS, COMMAND.COM, драйверы, внешние команды и т.д.). Все прикладные программы и вообще все программы и данные для них хранятся на дисках в виде файлов, поэтому можно сказать, что файловая система — ключевая подсистема DOS.

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

Файловая система работает с дисками через драйверы. Драйверы, в свою очередь, пользуются сервисом BIOS.

На уровне BIOS выполняются элементарные операции с диском, такие как чтение/запись секторов, форматирование и т.п. Этот низкий уровень доступен и прикладной программе, но обычно она пользуется функциями прерывания DOS, выполняющими все необходимые действия по обслуживанию каталогов и таблицы размещения файлов (File Allocation Table — FAT). Программы защиты от несанкционированного доступа или копирования вынуждены обращаться к средствам более низкого уровня, вызывая прерывания BIOS, или даже работать с контроллером дисковода через порты ввода/вывода.

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

Система управления памятью.

Эта подсистема DOS используется для распределения памяти запускаемым программам.

DOS управляет памятью с помощью блоков MCB (Memory Control Block). Память разбивается на блоки; каждому блоку предшествует MCB, в котором записаны характеристики блока памяти. Для каждой вновь запускаемой программы DOS создает определенное количество блоков MCB. При освобождении памяти или при выполнении запросов на получение дополнительной памяти DOS также использует блоки MCB, проверяя при этом правильность их содержимого.

Все блоки MCB располагаются друг за другом. Адрес первого блока хранится в векторной таблице связи, CVT, о которой мы будем говорить в главе 2. Там же будет описан формат блока управления памятью.

Прикладная программа может заказать для себя дополнительные блоки памяти. Для этого она обращается к системе управления памятью, используя функции прерывания 21h DOS.

Система управления программами.

При запуске программы DOS выполняет несколько операций. Сначала она обращается к системе управления памятью, чтобы подготовить блоки памяти для запускаемой программы. С помощью файловой системы файл, содержащий программу, загружается в память, после чего программа (это относится только к файлам типа .exe) настраивается на конкретный физический адрес. Только после этого программе передается управление.

Как известно, в MS-DOS существуют два формата выполняемых программ — .com и .exe. Способы запуска этих программ сильно различаются. Система управления программами автоматически распознает их и загружает в память по-разному. Мы еще вернемся к описанию различий между этими типами программ.

Другая задача, решаемая ситемой управления программами — запуск программ из программ и загрузка «программных перекрытий» — оверлеев. Если не все модули большого программного комплекса нужны одновременно, вы можете разбить комплекс на несколько частей. Это могут быть либо несколько отдельных программ, либо несколько оверлейных модулей. Каждый из этих способов имеет свои преимущества и недостатки; оба они пригодны для экономии памяти.

И наконец, последняя функция системы управления программами — работа с резидентными программами. Если вам надо, чтобы после завершения своей работы программа осталась резидентной в памяти, вы, как и в случае завершения обычной программы, обращаетесь к системе управления программами через соответствующую функцию прерывания DOS 21h.

Система связи с драйверами устройств.

Эта система скрыта от прикладных программ — программы не могут обращаться непосредственно к драйверам устройств ввода/вывода. Программа вызывает DOS, а DOS обращается при необходимости к драйверам.

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

Для управления состоянием устройства ввода/вывода или состоянием драйвера используется специальная функция 44h прерывания DOS 21h. Эта функция предназначена для обмена управляющей информацией между прикладной программой и драйвером.

Система обработки ошибок.

Система обработки ошибок DOS проста и удобна. Для кодирования ошибок как правило используется флаг переноса (CARRY, CF). Если после обращения к прерыванию DOS флаг переноса установлен в 1, произошла ошибка. Для того чтобы проанализировать ошибку и предпринять какие-то действия, можно вызвать соответствующую функцию DOS, которая вернет уточняющую информацию об ошибке и предоставит соответствующие рекомендации (разумеется, лишь в виде кодов, находящихся в регистрах процессора).

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

Служба времени.

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

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

Операционная система содержит драйвер устройства CLOCK$. Прикладная программа может обратиться к этому устройству для чтения показания часов или для установки часов. В книге 2 первого тома приведен пример программы для работы с устройством CLOCK$.

Программа может также использовать прерывания таймера для регулярного выполнения каких-либо функций.

Ввод/вывод на консоль оператора.

Консоль оператора состоит из двух устройств — клавиатуры и дисплея. Эти два устройства обслуживаются одним драйвером — драйвером консоли CON. Т.е. можно считать, что в компьютере имеется устройство — консоль — с именем CON.

Операционная система обслуживает консоль с помощью функций прерывания 21h, обеспечивающих ввод и вывод символов на устройство CON. Для работы с физической клавиатурой и дисплейным адаптером этот драйвер использует прерывания BIOS.

Другие подсистемы DOS.

DOS имеет набор драйверов для работы с печатающими устройствами и последовательными портами, которые обеспечивают прием/передачу символов и управление режимами работы устройств.

Кроме того, для печати текста в фоновом режиме в состав дистрибуции DOS входит программа PRINT.COM. Эта практически единственная «мультизадачная» утилита операционной системы является примером стандартной резидентной программы. Она позволяет выполнять параллельно с печатью текста другую работу (например, редактирование другого текста).

Специально следует отметить драйверы электронного диска и кэш-памяти. Драйвер электронного диска называется RAMDRIVE.SYS. Этот драйвер организует в расширенной или в дополнительной памяти компьютера быстрый псевдо-диск. Можно организовать электронный диск и в основной памяти, но основной памяти всегда мало!

Операционная система MS-DOS версий 4.01 и 5.0 имеет в своем составе систему управления дополнительной и расширенной памятью, которая реализуется драйвером HIMEM.SYS. Этот драйвер позволяет программам, составленным специальным образом, использовать расширенную или дополнительную память для хранения данных (но не для выполнения программ).

Если подключен драйвер HIMEM.SYS, то с помощью драйвера SMARTDRV.SYS можно создать кэш-память для жесткого диска. Особенно эффективно применение кэш-памяти для работы с базами данных, когда вам периодически требуется одна и та же информация. В следующий раз, когда информация потребуется, она будет доступна без обращения к диску.

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

Другие устройства ввод/вывода (сканеры, плоттеры, стримеры и т.п.) также не поддерживаются DOS. Для этих устройств фирмы поставляют драйверы, которые надо подключить к операционной системе.

Как правило, любая программа работает с тем или иным устройством ввода/вывода. Программы для первых ЭВМ работали непосредственно с портами и регистрами этих устройств. Модули, выполняющие такие стандартные действия, как ввод данных с перфокарт или печать результатов вычислений, входили в состав пользовательских программ.

В начале своего развития микропроцессорные системы имели в своем составе программу, называемую «монитор». Эта программа обычно находилась в постоянном запоминающем устройстве и обслуживала устройства ввода/вывода: клавиатуру, дисплей, кассетный накопитель на магнитной ленте и др. Диалоговая часть монитора позволяла выполнять некоторые операторские функции: загрузку и запуск программы, отладку программы в пошаговом режиме, печать текстов, просмотр и редактирование содержимого памяти и т.п. Но самое главное — прикладные программы, составленные для этих систем, могли пользоваться модулями монитора для работы с периферийной аппаратурой и для выполнения других функций.

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

Как программа пользовалась услугами монитора? Механизм взаимодействия программы пользователя и монитора был реализован по-разному в разных системах. В худшем случае прикладная программа пользовалась известными абсолютными адресами модулей монитора, в лучшем — использовала специальные таблицы адресов программных модулей.

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

В первом массовом персональном компьютере IBM PC модули обслуживания стандартной периферии были записаны в постоянном запоминающем устройстве. Совокупность этих модулей (плюс программа начальной инициализации и тестирования) называется базовой системой ввода/вывода — Basic Input/Output System. Общепринятое сокращение — BIOS.

Выпускаемые различными фирмами компьютеры, совместимые с IBM PC, могут немного отличаться по типу периферийного оборудования, но для достижения совместимости с IBM PC модули BIOS нивелируют эти различия, предоставляя в распоряжение программы пользователя стандартный набор модулей для работы с устройствами ввода/вывода.

Не будет преувеличением сказать, что одна из причин такого невиданного успеха компьютера IBM PC на рынке персональных компьютеров — наличие хорошо продуманного стандартного интерфейса модулей BIOS и прикладных программ. Именно благодаря этому интерфейсу достигается почти стопроцентная совместимость по программному обеспечению компьютеров этого типа, выпускаемых разными фирмами.

В этом разделе книги мы расскажем о том, как прикладные программы, составленные для компьютера, совместимого с IBM PC, могут пользоваться модулями BIOS для работы со стандартной периферией, затем приведем краткий обзор основных модулей BIOS.

Напомним вам, что такое программные прерывания, так как именно они используются для вызова модулей BIOS.

В начале оперативной памяти персонального компьютера (в пределах первого килобайта) находится так называемая векторная таблица прерываний. Она состоит из 256 ячеек, хранящих адреса программ-обработчиков прерывания. Мы будем подробно изучать эту таблицу в главе 4, а сейчас вспомним машинную команду INT .

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

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

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

Не все номера прерываний n используются BIOS. Часть из них предназначена для аппаратных прерываний от устройств ввода/вывода, часть зарезервирована для DOS, часть — для программ пользователя.

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

Получение информации об оборудовании


INT 11h — Получить список оборудования.

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

Программа, вызывая прерывание INT 11h, получает в регистре AX содержимое этой ячейки. Каждый бит в слове конфигурации отвечает за соответствующее устройство.

Анализируя слово конфигурации, программа может узнать, входят ли в состав оборудования компьютера дискеты и если входят, то сколько дисководов имеется в наличии, присутствует ли арифметический сопроцессор, какой начальный режим дисплейного адаптера используется, сколько в системе принтеров, адаптеров последовательного интерфейса RS232, подключен ли игровой адаптер (джойстик)?

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

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

INT 12h — Получить размер основной памяти.

Сказанное выше справедливо и по отношению к оперативной памяти. Для работы некоторых программ требуется достаточное количество памяти. Прерывание INT 12h возвращает в регистре AX количество имеющихся блоков памяти размером в один килобайт. Анализируя эту величину, программы могут при нехватке памяти либо вывести на экран соответствующее сообщение и отказаться от работы, либо изменить алгоритмы работы, организовав, например, «виртуальную» память на диске или просто записывая в файл промежуточные результаты.

Если Ваш компьютер оборудован расширенной памятью (адресное пространство этой памяти находится выше границы в 1 мегабайт), размер этой памяти в килобайтах можно узнать, вызвав прерывание INT 15h со значением регистра AX, равным 8800h.

Работа с дисплейным адаптером.

Прерывание INT 10h выполняет все многочисленные операции по обслуживанию дисплейного адаптера.

При вызове прерывания INT 10h, как и при вызове многих других прерываний, регистр AH содержит номер функции, которую требуется выполнить. Остальные регистры при вызове прерывания содержат операнды.

Программирование дисплейного адаптера — сложная задача. Функции, выполняемые прерыванием INT 10h обширны, полностью они будут описаны во втором томе книги. Приведем краткий обзор функций прерывания INT 10h.

00h — Задание видеорежима.

Эта функция обычно вызывается первой при начале работы с дисплейным адаптером или при необходимости изменить текущий режим адаптера. Что здесь имеется в виду?

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

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

01h — Установить характеристики курсора.

С помощью этой функции вы можете установить размер и форму курсора, сделать курсор мигающим или убрать его совсем.

02h — Установить положение курсора.

Эта функция позволяет управлять расположением курсора на экране, в частности, один из способов убрать курсор — расположить его за пределами экрана, например, на несуществующей 26 строке.

03h — Получить положение курсора.

Программа может узнать в любое время, где расположен курсор. Это может потребоваться ей, например, для того, чтобы переместить курсор в следующую позицию (вправо, вверх, вниз, на 10 символов левее текущего положения и т.д.).

04h — Получить положение светового пера.

Световое перо используется относительно редко, однако если оно есть, то функция 04h позволит вам работать с этим устройством.

05h — Выбрать активную страницу дисплейной памяти.

Компьютер хранит, как правило, не один отображаемый образ экрана, а несколько. Для этого видеопамять (память для хранения видеоизображения, находится на плате видеоконтроллера) разбивается на так называемые страницы. Отображается только активная страница видеопамяти.

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

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

06h, 07h — Прокрутка (скроллинг) окна вверх/вниз.

С помощью этих функций вы сможете переместить выбранную область окна на заданное число строк вверх или вниз. Освободившееся место будет заполняться пустыми строками. Одно из применений этой функции — полная очистка экрана.

08h, 09h — Прочитать/записать символ и атрибут.

С помощью этих функций можно прочитать или записать символ и его атрибут. При записи символа можно задать число повторений. Функцию записи с повторением удобно использовать для заполнения области экрана каким-либо символом.

Запись/чтение символа начинается с текущего положения курсора.

0Ah — Записать символ.

Эта функция предназначена для записи символа в видеопамять без задания для него индивидуального значения атрибута. Используется текущий атрибут. Можно задавать кратность записи.

0Bh — Выбрать цветовую палитру.

Эта функция позволяет управлять цветом рамки вокруг изображения в текстовом режиме и цветом фона в графическом режиме (для адаптеров EGA, VGA).

0Ch, 0Dh — Записать/прочитать графическую точку.

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

0Eh — Запись символа на экран в стиле TTY.

После записи символа на экран курсор продвигается на следующую позицию, при этом обрабатываются такие управляющие символы, как BEL (подача звукового сигнала), возврат на одну позицию, перевод строки, возврат к началу строки.

0Fh — Прочитать текущий видеорежим.

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

Кроме того, функция возвращает количество столбцов на экране и номер текущей активной дисплейной страницы.

10h, 11h, 12h — Обслуживание адаптера EGA.

Эти функции работают только при использовании дисплейных адаптеров EGA и VGA. Они позволяют устанавливать свою цветовую палитру, загружать знакогенератор (например, шрифтом для русских букв) и выполнять некоторые другие функции.

13h — Запись строки.

Для машин класса AT и выше при наличии дисплейных адаптеров EGA или VGA эта функция позволяет вывести на экран произвольную строку символов заданной длины, с заданным атрибутом и в заданном месте экрана. Можно также задать номер дисплейной страницы.

Если вы не можете использовать эту функцию (Ваш компьютер — XT или дисплейный адаптер — CGA), единственный способ вывести на экран строку символов с помощью прерывания INT 10h — вызывать в цикле функции 09h, 0Ah или 0Eh для вывода строки по одному символу.

Обслуживание клавиатуры.

Обработчик прерывания INT 16h выполняет несколько функций, связанных с обслуживанием клавиатуры. Мы не будем сейчас перечислять эти функции, они будут подробно описаны в главе, посвященной клавиатуре. С помощью функций обслуживания клавиатуры можно выполнить ввод кода нажатой клавиши как с ожиданием нажатия, так и без ожидания. В последнем случае функция сразу после вызова возвращает код нажатой клавиши или признак того, что никакая клавиша не нажималась.

Заметим, что символы, введенные с клавиатуры, помещаются в специальный клавиатурный буфер. Функция ввода символа без ожидания нажатия на клавишу проверяет состояние буфера — есть в нем символы, или нет. Если в буфере есть символы, первый помещенный в буфер символ возвращается программе. Этот символ затем может быть считан функцией ввода с ожиданием нажатия — фактически ожидания при этом не будет.

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

Для машин класса не ниже AT обработчик прерывания INT 16h выполняет и другие функции: установку задержки, запись символов в буфер клавиатуры, обслуживание расширенной клавиатуры.

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

Прерывание INT 13h предназначено для обслуживания жестких и флоппи-дисков. Многочисленные функции прерывания INT 13h выполняют все операции по вводу/выводу на диски. Мы сделаем обзор только самых важных функций, остальные будут рассмотрены в книге 3, посвященной файловой системе.

00h — Сброс дисковой системы.

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

01h — Получить состояние дисковой системы.

Эта функция позволяет проверить результат выполнения предыдущей операции. Если операция завершилась аварийно, при помощи этой функции можно определить код ошибки.

02h/03h — Чтение/запись секторов.

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

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

04h — Проверка секторов.

Функция проверяет сектора на правильность циклической контрольной суммы, CRC (Cyclic Redundancy Check); записи содержимого секторов в память не происходит.

Другие функции прерывания INT 13h.

Среди других функций прерывания INT 13h — форматирование дорожки, позиционирование головки на заданную дорожку диска, тестирование и предварительная установка диска, запуск диагностики контроллера и многое другое. Описание этих функций мы отложим до глав, посвященных файловой системе.

Вывод на принтер (параллельный порт).

BIOS содержит простейшую поддержку принтера — три функции прерывания INT 17h. Это функция 01h — инициализация принтера, 02h — опрос состояния принтера и 00h — вывод символа на принтер.

Поскольку к персональному компьютеру можно подключить несколько последовательных портов, при обращении к принтеру следует указывать номер порта.

Обслуживание последовательного порта связи

Функции прерывания INT 14h обслуживают порт последовательной передачи данных RS232. С помощью этих функций можно задавать формат и скорость передачи данных, определять состояние портов и, конечно, выполнять побайтную передачу данных.

Работа с системными часами.

Функции прерывания INT 1Ah обслуживают часы, имеющиеся в каждом компьютере. С их помощью вы можете установить время и дату, опросить текущее состояние часов. Вы можете работать с часами реального времени, которые имеются на машинах класса не ниже AT.

Для AT можно установить на заданное время «будильник» — в нужный момент будет вызвано прерывание «будильника» с номером 4Ah. Обработчик прерывания INT 4Ah может подать звуковой сигнал или вывести на экран предупреждающее сообщение.

Перезагрузка операционной системы.

Вызов прикладной программой прерывания INT 19h приведет к перезагрузке операционной системы.

Системный сервис для машин класса AT.

Прерывание INT 15h использовалось в компьютерах IBM PC и IBM PC Jr для управления кассетным накопителем на магнитной ленте (функции 0-3). Для машин класса AT и более высокого класса прерывание INT 15h имеет и другое назначение. С его помощью обслуживается расширенная клавиатура, выполняется программная задержка, задаваемая в микросекундах, обслуживается расширенная память. Кроме того, одна из функций прерывания INT 15h переводит процессор 80286 или 80386 в защищенный режим. Заметим, что вернуть процессор обратно в реальный режим можно только сигналом начального сброса. Это же относится и к арифметическому сопроцессору 80287.

Функция C0h прерывания INT 15h выдает дополнительные сведения о конфигурации аппаратных средств компьютера.

Для PS/2 назначение некоторых функций этого прерывания другое по сравнению с машиной AT.

На этом мы завершим описание предоставляемых BIOS функций и перейдем к обзору функций DOS.

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

Все основные функции DOS вызываются с помощью прерывания INT 21h, однако DOS использует и другие прерывания:

INT 20h завершение работы программы;
INT 25h/26h чтение/запись на диск с абсолютной адресацией секторов;
INT 27h завершение работы программы с оставлением ее резидентной в памяти;
INT 28h прерывание зарезервировано для DOS, может быть использовано для составления резидентных программ;
INT 2Eh выполнение команды DOS;
INT 2Fh прерывание мультиплексора, используется для спулера печати PRINT.COM.

Функции прерывания INT 21h можно разделить на следующие группы:

  • получение системной информации;
  • символьный ввод/вывод;
  • работа с файловой системой;
  • управление программами;
  • управление памятью;
  • связь с драйверами устройств;
  • прочий системный сервис.

В данном обзоре мы кратко рассмотрим эти группы, делая акцент в основном на составе функций. Полностью информация об использовании функций прерывания DOS INT 21h (и других прерываний DOS) будет приводиться в соответствующих разделах книги.

Номер функции задается при вызове прерывания INT 21h в регистре AH.

Получение системной информации.

Функция 30h возвращает в регистре AX номер версии DOS. Например, для версии MS-DOS 5.00 содержимое регистра AH равно 00, регистра AL — 05.

Дополнительно через регистр BH функция возвращает программе серийный номер фирмы-производителя ОЕМ (IBM — 00, DEC — 16h, 0FFh — Microsoft и т.п.), а в регистрах BL:CX после вызова функции находится серийный номер пользователя.

Эта информация может применяться для анализа возможности использования таких средств операционной системы, которые поддерживаются не всеми версиями DOS, или для настройки программы на конкретный серийный номер пользователя.

Функции 2Ah и 2Ch позволяют программе узнать системную дату и время.

Есть функции, возвращающие текущий диск и текущий каталог. Номера этих функций — 19h и 47h.

Функция 2Fh позволяет программе узнать адрес текущей области DTA (Disk Transfer Area). Эта область используется, например, при поиске файлов в каталоге.

Важная информация находится в блоке PSP (Programm Segment Prefix). Этот блок располагается в памяти непосредственно перед выполняющейся программой. В нем находятся, в частности, параметры, передаваемые программе при запуске. Функция 62h возвращает адрес текущего блока PSP.

Кратко перечислим некоторые другие функции для получения системной информации:

35h получить значение вектора прерывания с заданным номером;
4Dh узнать код завершения процесса;
59h получить расширенный код ошибки;
54h узнать, используется ли проверка при записи на диск;
33h узнать, используется ли проверка на CTRL-BREAK.

Символьный ввод/вывод.

Эти функции применяются для работы со всеми символьными устройствами, такими как консоль, принтер, последовательный порт, и называются функциями стандартного ввода/вывода.

Ввод/вывод программы, использующей стандартные функции, может быть переназначен.

Приведем обзор основных функций стандартного символьного ввода/вывод в виде таблицы:

Код Назначение Описание
01h Ввод с клавиатуры Выполняется ввод символа со стандартного ввода и эхо-вывод символа на стандартное устройство вывода. Выполняется проверка на нажатие комбинации клавиш CTRL/C и CTRL-BREAK
06h Ввод с клавиатуры Ввод символа со стандартного ввода без ожидания и вывод его на устройство стандартного вывода. Комбинации CTRL/C и CTRL-BREAK не проверяются.
07h Прямой ввод Ввод символа со стандартного с клавиатуры устройства ввода. Комбинации клавиш CTRL/C и CTRL-BREAK не проверяются.
08h Ввод с клавиатуры Аналогично функции 07h, но проверяются комбинации клавиш CTRL/C и CTRL-BREAK.
02h Отобразить символ Отображаемый символ посылается на стандартное устройство вывода.
09h Отобразить строку На стандартное устройство вывода символов посылается строка, закрытая символом ‘$’.
03h Ввод из последовательного порта Вводится символ из последовательного порта
04h Вывод в последовательный порт Выводится символ на последовательный порт
05h Вывод на принтер Выводится символ на принтер.


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

Для вывода строки символов можно использовать функцию 09h, но выводимая строка не может содержать символ ‘$’, так как этот символ используется в качестве признака конца строки.

Работа с файловой системой.

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

С помощью файловых функций DOS можно создавать и удалять файлы и каталоги, открывать и закрывать файлы, создавать временные файлы. Ввод/вывод может быть буферизован, можно получить как последовательный доступ к содержимому файла, так и произвольный.

Мы не будем приводить сейчас конкретные примеры или номера функций, отложим это до книги 3, посвященной файловой системе.

Управление программами.

DOS предоставляет программам возможность организовать запуск других программ или загрузку и выполнение программных оверлеев. Для этого служит функция 4Bh.

Для завершения работы программа должна также использовать одну из специальных функций DOS. Функция 4Ch, завершая работу программы, позволяет передать операционной системе некоторое число, называемое кодом завершения программы. Это число может быть затем проанализировано в пакетном файле командой IF ERRORLEVEL. Если одна программа запускает другую, то первая может получить код завершения второй с помощью функции 4Dh.

Для того чтобы завершающаяся программа осталась в оперативной памяти (т.е. стала резидентной), она должна вызвать прерывание INT 27h или воспользоваться функцией 31h.

Мы приведем различные примеры запуска программ из программ и научимся составлять резидентные программы.

Управление памятью.

DOS управляет распределением памяти с помощью блоков управления памятью MCB (Memory Control Block). Вся память разбивается на блоки различного размера, которым предшествует блок MCB, содержащий характеристики данного блока памяти (например, его размер).

Программа может динамически получать и освобождать области памяти с помощью функций 48h и 49h соответственно. Кроме того, можно изменять размер блока, выделенного операционной системой программе. Это делает функция 4Ah.

Детально механизм управления памятью будет рассмотрен в главе 2 при описании векторной таблицы связи DOS.

Связь с драйверами устройств.

Мы уже обращали Ваше внимание на то, что программы не могут обращаться непосредственно к драйверам устройств ввода/вывода. Все обращения к драйверам имеют либо неявный характер (ввод/вывод с помощью функций прерывания INT 21h), либо используют специальную функцию DOS с кодом 44h. Эта функция используется для обмена управляющей информацией между драйвером и программой.

Другие функции.

Существуют функции, позволяющие переопределять прерывания, работать с системными часами и календарем, функции для работы в сети и некоторые другие. Эти функции будут описаны позже в соответствующих разделах книги.

Когда программа обращается к DOS для выполнения какой-либо операции, она должна вызвать соответствующее прерывание, загрузив перед вызовом прерывания все необходимые операнды в регистры процессора. Если выполнение операции невозможно по каким-то причинам (неправильные операнды, устройство неработоспособно, запрашиваемая операция не поддерживается текущей версией DOS и т.д.), то для большинства функций DOS устанавливается признак ошибки — флаг переноса CARRY. Для DOS версии 2.0 и более поздних версий регистр AX при этом содержит код ошибки.

Приведем коды ошибок, возвращаемые программе через регистр AX:

1 Неправильный код функции
2 Файл не найден
3 Путь не найден
4 Слишком много открытых файлов
5 Доступ запрещен
6 Неправильный идентификатор файла
7 Разрушен блок управления памятью
8 Недостаточно памяти
9 Неправильный адрес блока памяти
10 Неправильная среда
11 Неправильный формат
12 Неправильный код доступа
13 Неправильные данные
14 Зарезервировано
15 Ошибка при указании дисковода
16 Невозможно удалить текущий каталог
17 Другое устройство
18 Больше нет подходящих файлов

Для DOS версии 3.0 и более поздних версий обработка ошибок значительно расширена. Введена функция 59h прерывания INT 21h, предназначенная для получения дополнительной информации об ошибках.

При вызове этой функции регистр BX должен содержать индикатор уровня анализа ошибок, который должен быть равен 0. Кроме расширенного кода ошибки, возвращаемого в регистре AX, программа может получить класс ошибки (регистр BH), код предполагаемых действий (регистр BL), локализацию ошибки, т.е. место, где произошла ошибка (регистр CH).

К сожалению, эта функция разрушает содержимое регистров CL, DX, SI, DI, BP, DS, ES. Программа, использующая функцию 59h, должна позаботиться о сохранении содержимого этих регистров.

Расширенный код ошибки, возвращаемый в регистре AX, может принимать значения, указанные в приводимой ниже таблице. Коды от 1 до 18 эквивалентны представленным выше и второй раз не приводятся.

Расширенные коды ошибок:

19 Запись на защищенный от записи диск
20 Задан неизвестный идентификатор устройства
21 Дисковод не готов
22 Неизвестная команда
23 Ошибка циклического кода проверки
24 Неправильная длина структуры запроса
25 Ошибка поиска
26 Неизвестен тип среды носителя данных
27 Сектор не найден
28 Кончилась бумага в принтере
29 Ошибка записи
30 Ошибка чтения
31 Общая ошибка
32 Нарушение разделения файла
33 Нарушение блокировки файла
34 Неправильная замена диска
35 FCB недоступен (слишком много блоков FCB)
36 Переполнился буфер разделения
37 Зарезервировано
38 Не завершена операция «Конец файла»
39-49 Зарезервировано
50 Сетевая функция не поддерживается
51 Удаленный компьютер «не слышит»
52 Дублирование имени в сети
53 Сетевое имя не найдено
54 Сеть занята
55 Сетевое устройство больше не существует
56 Превышен лимит команды сетевой BIOS
57 Ошибка в аппаратуре сетевого адаптера
58 Неправильный ответ из сети
59 Непредусмотренная ошибка сети
60 Несовместимый удаленный адаптер
61 Заполнена очередь печати
62 Для печатаемого файла недостаточно места
63 Печатающийся файл был удален
64 Сетевое имя было удалено
65 Доступ запрещен
66 Неправильный тип сетевого устройства
67 Сетевое имя не найдено
68 Превышен лимит сетевого имени
69 Превышен лимит сеанса сетевой BIOS
70 Временная пауза
71 Сетевой запрос отвергнут
72 Приостановлена печать или переадресация диска
73-79 Зарезервировано
80 Файл уже существует
81 Зарезервировано
82 Невозможно создать дескриптор в каталоге
83 Ошибка обработчика критических ошибок INT 24h
84 Слишком много переназначений
85 Двойное переназначение
86 Неправильный пароль
87 Неправильный параметр
88 Ошибка данных в сети
89 Нет такой функции в сети
90 Требуемый компонент системы не установлен

Класс ошибки, передаваемый в регистре BH, содержит информацию, которая поможет вам обработать данную ошибку:

1 Недостаточно ресурсов: блоков FCB, памяти и т.д.
2 Временная ситуация
3 Нет прав доступа
4 Внутренняя ошибка DOS
5 Ошибка аппаратуры
6 Системная ошибка DOS (нет CONFIG.SYS и т.п.)
7 Ошибка в прикладной программе
8 Файл или объект не найден
9 Неправильный формат файла или объекта
10 Файл или объект заблокирован
11 Ошибка носителя данных
12 Файл или объект уже существует
13 Прочие ошибки

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

1 Повторить операцию позже. Можно спросить пользователя, желает он повторить операцию или завершить работу программы.
2 Повторить предыдущую операцию после небольшой паузы. Если ошибка не исчезла, следует спросить пользователя, будет он ждать и дальше, или следует завершить работу программы.
3 Если пользователь вводил какие-то данные для DOS, следует попросить его ввести эти данные еще раз (например, пользователь мог указать неправильный идентификатор диска или путь доступа к файлу).
4 Аварийно завершить работу прикладной программы с выполнением всех обычных завершающих действий (закрытие файлов, сброс буферов на диск, освобождение блоков памяти и т.д.)
5 Немедленный выход из программы без выполнения завершающих действий. Система находится в непредсказуемом состоянии.
6 Следует игнорировать ошибку.
7 Повторить операцию после того, как пользователь выполнит требуемые действия (установит дискету и т.п.).

Сведения о локализации ошибки передаются в регистре CH. Приведем таблицу кодов локализации:

1 Локализация ошибки не может быть определена (система не знает, где произошла ошибка).
2 Ошибка произошла в блочном устройстве (диск или магнитная лента).
3 Ошибка связана с сетью.
4 Ошибка произошла в символьном устройстве, например, в принтере.
5 Ошибка связана с оперативной памятью.

Если Ваша программа составлена на языке ассемблера, то после обращения к DOS через прерывание следует проверить состояние флага переноса:

Программы, составленные на языке Си, обращаются к прерываниям DOS обычно с помощью таких функций, как intdos, int86, intdosx и т.д. Для передачи параметров используются структуры REGS, WORDREGS, BYTEREGS, SREGS. Они описаны в файле dos.h, для использования этих структур программа должна содержать строку:

Значение флага переноса записывается в переменную cflag, определенную в структуре WORDREGS. Эта структура входит в объединение REGS:

Проверка переменной cflag может быть выполнена, например, таким образом:

Код ошибки при этом содержится в переменной outregs.x.ax.

Приведем пример программы, которая стирает каталог с именем DIR в текущем каталоге и, в случае ошибки, выводит расширенную информацию об ошибке, класс ошибки, код предполагаемых действий и код локализации ошибки:

При составлении программ обработки ошибок следует учитывать, что для DOS версии 1.0 при некоторых ошибках функции DOS возвращают в регистре AX значение 0FFh. Начиная с версии DOS 2.0, при ошибке устанавливается флаг переноса, код ошибки записывается в регистр AX. Однако для более полной диагностики причины ошибки следует использовать функцию 59h прерывания INT 21h.

Если Ваша программа, составленная на языке Си, вызывает функции DOS неявным образом (через функции стандартной библиотеки транслятора, такие как fprintf, puts и т.д.), то можно воспользоваться средствами обработки ошибок, входящими в состав стандартной библиотеки.

Когда при обращении к функциям DOS средствами стандартной библиотеки транслятора Си возникает ошибка, то в глобальную переменную errno записывается код ошибки.

Возможны следующие коды ошибок (они описаны в файле errno.h и stdlib.h):

ECHILD Нет порожденных процессов. Задача, не имеющая подзадач, выдала команду ожидания, или была выдана команда ожидания для подзадачи, имеющей признак NO-WAIT.
EAGAIN Больше нет процессов. Попытка создать новый процесс окончилась неудачно, т.к. либо больше нет резервов для создания процессов, либо недостаточно оперативной памяти, либо превышен максимальный уровень вложенности процессов.
E2BIG Слишком велик список аргументов. Либо размер списка аргументов превышает 128 байт, либо требуемый размер памяти для среды превышает 32К.
EACCES Доступ запрещен. Затребованный вид доступа к файлу запрещен или несовместим с установленными атрибутами файла (или каталога). Этот код ошибки передается при попытке чтения из неоткрытого файла, при попытке записи в файл, защищенный от записи, или при попытке открыть каталог как файл.
EBADF Плохой номер файла. Номер файла, использованный при вызове функции, имеет неверное значение или не относится к открытому файлу, или сделана попытка записи в открытый только для чтения файл или устройство.
EDEADLOCK Произошла блокировка ресурсов. Произведено 10 неудачных попыток заблокировать файл. Этот код ошибки используется только DOS версии 3.0 и более поздних версий.
EDOM Ошибка в аргументе математической функции. Аргумент математической функции вышел за пределы области определения этой функции.
EEXIST Файл уже существует. Сделана попытка создать файл с именем, которое уже используется существующим файлом.
EINVAL Неверный аргумент. Для одного из аргументов функции было задано неверное значение.
EMFILE Открыто слишком много файлов. Исчерпан запас номеров файлов , нельзя больше открыть ни одного файла.
ENOENT Нет такого файла или каталога. Запрошенный файл или каталог отсутствует или не может быть найден.
ENOEXEC Сделана попытка выполнить загрузочный файл, имеющий неправильный формат.
ENOMEM Недостаточно памяти. Эта ошибка появляется, когда недостаточно памяти для запуска процесса или для удовлетворения запроса программы на выделение блока памяти.
ENOSPC Нет свободного места на устройстве. На устройстве нет места для записи информации (например, переполнился диск).
ERANGE Слишком большой результат. Слишком большой по величине аргумент математической функции привел к частичной или полной потере значимости результата.
EXDEV Связь различных устройств. Сделана попытка переслать файл на другое устройство, используя функцию переименования.

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

Для диагностической выдачи сообщения об ошибке можно использовать функции perror и strerror. Первая функция выводит в stderr соответствующее сообщение об ошибке, вторая только формирует строку сообщения. Функции perror и strerror имеют операнд — указатель на строку. Эта строка добавляется в начало стандартного сообщения об ошибке. Если к стандартному сообщению ничего добавлять не надо, операнд должен иметь значение NULL.

Следует заметить, что значение переменной errno отражает последнюю ошибку. Успешный вызов функции не приводит к автоматическому сбросу переменной errno.

Поэтому функции perror и strerror необходимо вызывать сразу после того, как вызываемая функция возвратит признак ошибки.

Приведем пример программы, обрабатывающей ошибки с использованием переменной errno:

DOS имеет еще одно средство для обработки ошибок — обработчик критических ошибок (Critical Error Handler). Этот модуль вызывается DOS, когда она получает сообщение об ошибке от драйвера устройства.

Модуль выдает на экран хорошо известное вам сообщение:

Это сообщение обычно появляется тогда, когда вы забываете вставить дискету или начинаете печатать при отключенном принтере.

Прикладные программы могут подключать свой модуль обработки критических ошибок вместо стандартного. Мы научимся обрабатывать критические ошибки в книге 3. Там же будет приведен соответствующий пример.

Diplom Consult.ru

Функция 00h.Установка видеорежима (табл. 6.2) текущей видеостраницы с очисткой экрана (быстрая очистка экрана реализуется функцией 06h и 07h).

Al= видеорежим (код режима задаётся в младших 7 битах, установка в 1 старшего бита запрещает очистку экрана).

Текстовые видеорежимы и страницы в стандарте VGA, поддерживаемые современными видеоконтроллерами

По умолчанию в DOSиспользуется режим 3 (впрочем, корректно оформленная программа должна выполнять проверку или установку требуемого текстового режима с последующим восстановлением прежнего).

Функция 02h.Установка позиции курсора.

Задаёт положение курсора на экране в текстовых координатах, с которых в дальнейшем будет выводиться текст. Отсчёт номера строки и столбца ведётся от верхнего левого угла. Курсор можно установить как в текстовом, так и в графическом режиме, однако, в графическом режиме курсор не виден. BIOS поддерживает до восьми независимых курсоров – по одному на каждую страницу (см. табл. 3.2) независимо от того, какая страница является активной. Функцию 02hBIOSможно использовать в комбинации с функциямиDOSдля организации вывода на экран.

Вызов: AH = 02h;BH = номер страницы (0,1. 7), обычно 0;

Функция 03h.Считывание позиции и размера курсора.

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

Вызов: AH = 03h, BH =номер страницы (0,1. 7), обычно 0.

Возврат: DH, DL =строка и столбец текущей позиции курсора,

CH, CL = первая и последняя строки развёртки курсора.

Вызов разрушает регистры AX,BP,SIиDI.

Функция 05h.Установка видеостраницы.

Устанавливает активную видеостраницу (как текстовую, так и графическую).

Вызов: AH= 05h, AL=номер страницы (0. 7).

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

Функция 06h (07h).Инициализация или прокрутка окна вверх (вниз).

Инициализирует окно с указанными координатами, пробелами ASCII с заданным атрибутом(AL = 0), или прокручивает содержимое окна вверх (вниз) на заданное число строк (AL = число строк). При прокрутке появляющиеся снизу (сверху) строки заполняются пробеламиASCIIс заданным атрибутом. Функцию удобно использовать для быстрой очистки экрана или некоторого прямоугольного окна.

Вызов: AH = 06h(07h);

AL = 0 –очистка,AL = N (N >0) –прокрутка наNстрок;

BH =атрибут символов в окне;

CH, CL =координаты строки и столбца(Y,X) левого верхнего угла;

DH, DL =координаты строки и столбца(Y,X)правого нижнего угла.

Функция 08h.Чтение символа и атрибута в текущей позиции курсора на выбранной странице.

Вызов: AH = 08h,BH =номер страницы (0. 7), обычно 0.

Возврат: AH =атрибут символа,AL = ASCII-код символа.

Функция 09h. Запись символа с заданным атрибутом на экран в позицию курсора. Действует как в графическом, так и в текстовом режимах. В графическом режиме символы не должны переходить на следующую строку. Все коды в AL рассматриваются как символьные и не управляют положением курсора.После вывода символа курсор смещается к следующей позиции функцией 02h.Коэффициент повторения позволяет выводить строки одинаковых символов. В текстовом режиме символ выводится с указанным вBLатрибутом. В графическом – содержимоеBLвлияет только на цвет символа, но не на фон под ним. Графическое изображение под знакоместом затирается.

Вызов: AH =09h,AL = ASCII-код символа,

BL = атрибут символа (текстовый режим) или только цвет символа (графический режим),

BH = номер страницы (0,1. 7),CX = коэффициент повторения.

Функция 0Ah.Запись символа с текущим атрибутом на экран в позицию курсора. Функция действует как в графическом, так и в текстовом режимах. Символ принимает атрибут, установленный ранее для этой позиции.Все ASCII-коды в AL рассматриваются как символьные и не управляют положением курсора (также как и в функции 09h).После вывода символа курсор смещается к следующей позициифункцией 02h.

Вызов: AH = 0Ah,AL = ASCII-код символа,

BH =номер страницы (0,1. 7),CX =коэффициент повторения.

Функция 0Eh.Запись символа стекущим атрибутом в режиме телетайпа.

Записывает символ ASCIIв позицию курсора (предварительно установленную функцией02h) на активной странице и смещает курсор к следующей позиции. КодыASCII: 07h – звонок(BEL),08h – шаг назад(BS), 0Dh –возврат каретки(CR), 0Ah –перевод строки(LF),рассматриваются как управляющиеи выполняются соответствующие им действия. Остальные управляющие коды рассматриваются как символы и выводятся на экран. Действует автоматический перевод курсора на следующую строку после завершения предыдущей, а также прокрутка экрана вверх на 1 строку после заполнения самой нижней.

Вызов: AH = 0Eh,AL = ASCII-код символа,

BL = цвет символа (только для графического режима),

BH =номер страницы (0,1. 7),по умолчанию действует активная страница.

Функция 0Fh.Получить режим дисплея и номер текущей страницы.

Возврат: AL = режим дисплея,AH = ширина экрана в текстовом формате

BH =номер активной страницы.

Пример. Процедура установки позиции курсора на текущей странице.

Вход: dh= строка (0 – 25),dl = столбец (0 – 79)

. ;Сохранить регистры (по необходимости)

Функция 10h.Подфункция03h. Переключение бита «мерцание/яркость».

Определяет назначение старшего бита 7 атрибута символа: мерцание символа или повышенная яркость фона.

Вызов: AX = 1003h,BL = назначение 7-го бита атрибута:

0 – повышенная яркость, 1 – мерцание (устанавливается по умолчанию).

Функция воздействует сразу на все символы экрана, у которых установлен старший бит атрибута фона.

Функция 13h.Запись строки символов с заданными атрибутами.

Записывает строку в текущую страницу видеобуфера, начиная с указанной позиции. Коды ASCII:07h – звонок,08h – шаг назад,0Ah –перевод строки,0Dh –возврат каретки, рассматриваются как управляющие, остальные – как символьные.

Вызов: AH = 13h,AL =режим записи:

0 – атрибут символа в BL, строка содержит только коды символов, после записи курсор принимает исходное положение (т.е. вывод следующей строки, если не изменить позицию курсора, начинается с изначально установленной позиции);

1 – отличается от режима 0 тем, что после записи курсор остаётся в конце строки;

2 – строка содержит попеременно коды символов и атрибутов (т.е. каждый символ описывается 2 байтами – ASCII-кодом и атрибутом), после записи курсор принимает исходное положение;

3 – отличается от режима 2 тем, что по окончании вывода курсор остаётся в конце строки.

BH = номер страницы (0,1. 7),BL = атрибут для режимов 0 и 1,

CX = длина символьной строки (в длину входят только коды символов, но не байты атрибутов),

DX = DH.DL = координаты курсора (строка, столбец) в исходной точке вывода строки на экране,

ES:BP = адрес начала строки в памяти.

Обратите внимание на особенность задания адреса!

BIOS прерывания вызова — BIOS interrupt call

BIOS прерывания вызовов представляют собой средство , что операционные системы и прикладные программы используют для вызова объектов Basic Input / Output System на IBM PC совместимых компьютеров. Традиционно вызовы BIOS в основном используется DOS программ и некоторых других программ , таких как загрузчиков ( в том числе, в основном исторически, относительно простое программное приложение , которое загружается непосредственно и работает без системы, особенно игрового программного обеспечения операционной). BIOS работает только в режиме реального адреса (Real Mode) на x86 CPU, так что программы , которые требуют BIOS либо должны также работать в режиме реального времени или должны переключаться из защищенного режима в режим реального времени перед вызовом BIOS , а затем переключиться обратно. По этой причине современные операционные системы , использующие процессор в защищенном режиме , как правило , не используют BIOS для поддержки системных функций, хотя некоторые из них используют BIOS , чтобы исследовать и инициализировать аппаратные ресурсы во время их ранней стадии загрузки .

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

Со стороны IBM, они предоставляют всю информацию , необходимую для использования их BIOS полностью или напрямую использовать аппаратные средства и избежать BIOS полностью, при программировании на ранних моделях IBM PC (до PS / 2). С самого начала, программисты имели выбор с помощью BIOS или нет, на основе каждой аппаратной периферийного устройства. Сегодня BIOS в новом ПК по- прежнему поддерживает большинство, если не все, из вызовов функций прерывания BIOS , определенные IBM для IBM AT (введен в 1984 году), наряду со многими другими более новыми, а также расширения для некоторых оригиналов ( например , расширены диапазоны параметров). Это, в сочетании с аналогичной степенью совместимости аппаратных средств, означает , что большинство программ , написанных для IBM AT все еще может корректно работать на новом ПК сегодня, если предположить , что более высокая скорость исполнения является приемлемым (что типично для всех , кроме игр, использующих процессор на основе времени). Несмотря на значительные ограничения услуг , доступных через прерывания BIOS, они оказались чрезвычайно полезными и долговечными к технологическим изменениям.

содержание

Назначение вызовов BIOS

BIOS прерывание вызовов осуществляют контроль аппаратного или ввод / вывод функцию , запрашиваемую программой, возвращение системы информации в программу, или то и другие. Ключевой элемент с целью BIOS называет это абстракция вызовы BIOS выполняет определенные функции в целом, а также конкретные детали того , как эти функции выполняются на конкретной аппаратной части системы инкапсулируются в BIOS и скрыты от программы. Так, например, программа , которая хочет читать с жесткого диска , не нужно знать , что жесткий диск является ли ATA , SCSI или SATA диск (или в более ранние дни, ESDI диск, или MFM или RLL диск с возможно, Seagate ST-506 контроллер, возможно , один из нескольких Western Digital типов контроллеров, или с другим фирменным контроллером другого бренда). Программа должна только определить номер диска он желает получить доступ и адрес сектора он должен читать или писать, и BIOS будет заботиться о переводе этого общего запроса в определенную последовательность элементарных операций , необходимых для завершения задачи путем конкретного диск аппаратного контроллера , который подключен к этому диску. Программа освобождается от необходимости знать , как управлять на низком уровне каждый тип жесткого диска (или адаптера дисплея или интерфейса порта, или в режиме реального времени часы периферией) , что , возможно , потребуется доступ. Это и делает операционные системы программирования и приложения проще и делает программы меньше, сокращение дублирования программного кода, как функциональность, которая включена в BIOS не должна быть включена в каждой программе , которая нуждается в ней; относительно короткие звонки в BIOS включены там вместо этого. (В операционных системах , где BIOS не используется, звонки услуг , предоставляемые операционной системой сам обычно выполняют ту же функцию и цель.)

BIOS также освобождает компьютерного оборудования дизайнеров (в той степени , что программы, написанные для использования BIOS исключительно) от будучи стесненными поддерживать точную аппаратную совместимость со старыми системами при разработке новых систем для того, чтобы обеспечить совместимость с существующим программным обеспечением. Например, аппаратная клавиатура на IBM PCjr работает совсем иначе , чем аппаратная клавиатура на более ранних моделях IBM PC, а программу , которые используют клавиатуру только через BIOS, эта разница почти невидима. (Как хороший пример другой стороны этого вопроса, значительная доля компьютерных программ, используемых в то время , когда PCjr был введен не использовать клавиатуру через BIOS исключительно, поэтому IBM также включены аппаратные средства в PCjr подражать способ , оригинальный IBM PC и IBM PC XT аппаратной клавиатуры работает. эмуляции аппаратного обеспечения не является точным, так что не все программы , которые пытаются использовать аппаратные клавиатуры непосредственно будут корректно работать на PCjr, но все программы , которые используют только службу BIOS клавиатуры .)

В дополнении к предоставлению доступа к аппаратным средствам, BIOS обеспечивает дополнительные средства, которые реализованы в программном обеспечении BIOS. Например, в BIOS поддерживает отдельные позиции курсора на срок до восьми страниц текста дисплея и обеспечивает Tty -кака выхода с автоматической оберткой линии и интерпретацией основных управляющими символами , такими как возврат каретки и перевод строки, в то время как аппаратные CGA-совместимый текстовый дисплей имеет только один глобальный курсор и не может автоматически перемещать курсор или интерпретировать управляющие символы.

Вызывающие BIOS: программное обеспечение BIOS прерывания

Операционные системы и другое программное обеспечение взаимодействуют с программным обеспечением BIOS, для того, чтобы контролировать установленное оборудование, с помощью программных прерываний. Прерывание программного обеспечения представляет собой видовое разнообразие общей концепции прерывания. Прерывание представляет собой механизм, с помощью которого процессор может быть направлен, чтобы остановить выполнение программы главной строки и сразу же выполнить специальную программу, называемую процедуру обслуживания прерывания (ISR), вместо этого. После того, как ISR заканчивается, процессор продолжает с основной программой. На x86 процессорах, то ISR для вызова, когда происходит прерывание обнаруживается путем поиска в таблице их адрес (так называемый «векторы прерываний») в памяти. Прерывание вызывается по номеру типа, от 0 до 255; номер типа используется в качестве индекса в таблице; адрес найден в таблице адрес ISR, которая будет запущена в ответ на прерывание. Программное прерывание просто прерывание, которое вызывается командой программного обеспечения; Поэтому, программные прерывания функции как подпрограммы, с основной разницей, что программе, которая делает вызов прерывания программного обеспечения не нужно знать адрес ISR, только его номер прерывания. Это имеет преимущество для модульности, совместимости и гибкости в конфигурации системы.

BIOS прерывание вызовов можно рассматривать как механизм передачи сообщений между BIOS и операционной системой или другим клиентским программным обеспечением BIOS. Сообщения запрос данных или действий с BIOS и вернуть запрошенные данные, информации о состоянии и / или продукт запрашиваемого действия к абоненту. Сообщения разбиты на категории, каждый со своим собственным номером прерывания, и большинство категорий содержат подкатегории, называемые «функции» и идентифицированные «номера функции». Клиент BIOS передает большую часть информации в BIOS в регистрах процессора, и получает большую часть информации обратно тот же путь, но данные слишком велики , чтобы поместиться в регистрах, такие как таблицы параметров управления или данные сектора диска для диска передачи, передаются путем выделения буфера (то есть некоторое пространство) в памяти и передача адреса буфера в регистрах. (Иногда несколько адресов элементов данных в памяти могут быть переданы в структуру данных в памяти, с адресом этой структуры , передаваемой в BIOS в регистрах.) Прерывание номер задается в качестве параметра команды прерывания программного обеспечения (на языке Intel сборки , «INT» команды), и функция номер которого указан в регистре AH; то есть, вызывающий абонент устанавливает регистр AH к числу требуемой функции. В целом услуги BIOS , соответствующие каждый номер прерывания работают независимо друг от друга, но функции в рамках одной службы прерываний обрабатываются одной и той же программой BIOS и не являются независимыми. (Этот последний пункт имеет отношение к реентерабельности .)

Программное обеспечение BIOS, как правило, возвращается к абоненту с кодом ошибки, если не удается, или с кодом состояния и / или в случае успеха запрашиваемых данных. Сами данные могут быть как один бит или больше, 65536 байт целых секторов сырым диска (максимум, который будет вписываться в один сегмент памяти в реальном режиме). BIOS была расширена и улучшена за эти годы много раз многими различными юридическими лицами, и, к сожалению, результатом этой эволюции является то, что не все функции BIOS, которые можно назвать использование согласованных конвенций для форматирования и передачи данных или для отчетности о результатах. Некоторые функции BIOS сообщают подробную информацию о состоянии, в то время как другие не могут даже представить успех или неудачу, но только молча вернуться, оставив вызывающему предположить успех (или испытать на исход какой-то другой путь). Иногда он также может быть трудно определить, является ли определенный вызов функции BIOS поддерживается BIOS на определенном компьютере, или то, что пределы параметров обработки вызовов находятся на этом компьютере.

Из — за прерывания BIOS , вызовы используют процессор на основе регистров передачи параметров, вызовы ориентированы на которые сделаны из ассемблере и не могут быть непосредственно изготовлены из большинства языков высокого уровня (ЯВА). Тем не менее, высокий уровень языка может обеспечить библиотеку обертки подпрограмм , которые переводят параметры из формы (обычно укладывают на основе) , используемый на языке высокого уровня на основе регистров форме , требуемой BIOS, а затем обратно к HLL вызывающей конвенции после того, как В BIOS возвращает. В некоторых вариантах C, вызовы BIOS могут быть выполнены с использованием встроенного ассемблера в модуле C. (Поддержка языка встроенного ассемблера не является частью стандарта ANSI C , но является расширением языка;. Таким образом, модули C, использующие встроенным язык ассемблера менее компактны , чем чистые модули стандарта ANSI C)

Вызов прерывания

Вызов прерывания может быть сделано с помощью INT x86 ассемблера инструкции. Например, чтобы напечатать символ на экране с помощью BIOS прерывания 0x10, могут быть выполнены следующие инструкции языка x86 сборки:

таблица прерываний

Список классов общего BIOS прерывания можно найти ниже. Обратите внимание, что некоторый БИОС (особенно старые) не реализует все эти прерывания классов.

BIOS также использует некоторые прерывания для передачи аппаратных прерываний события к программам, которые решили получить их или направлять сообщения для своих собственных нужд. В приведенном ниже таблице включает в себя только ту BIOS прерывания, которые предназначены для вызова с помощью программ (с использованием «INT» команды прерывания программного обеспечения на языке ассемблера) запрашивать услуги или информацию.

векторное прерывание Описание
05h Выполняется при Shift- экран печати нажата, а также , когда BOUND инструкция обнаруживает связанный отказ.
10h Видео услуги
AH Описание
00h Установить режим видео
01h Установите курсор Shape
02h Установить позицию курсора
03h Получить Cursor положение и форма
04h Получить Light Pen позиции
05h Настройка отображения страницы
06h Очистить / Прокрутка экрана вверх
07h Clear Screen / Прокрутка вниз
08h Read символ и атрибут курсора на
09h Написать символ и атрибут в Cursor
0Ah Написать в Character Cursor
0Bh Установить Цвет рамки
0Ch Написать График Pixel
0Dh Читать График Pixel
0Eh Написать Character в режиме телетайпа
0Fh Получить видеорежим
10h Установка палитры регистрам (EGA, VGA, SVGA)
11h Генератор символов (EGA, VGA, SVGA)
12h Альтернативные Выберите Функции (EGA, VGA, SVGA)
13h Написать строки
1Ah Получить или установить Дисплей кодовой комбинации (VGA, SVGA)
1Bh Получить Функциональность информация (VGA, SVGA)
1Ch Сохранение или восстановление видео государства (VGA, SVGA)
4Fh VESA BIOS Extension функции (SVGA)
11h Возвращает список оборудования
12h Возврат обычной памяти размера
13h Низкий уровень дисков Услуги
AH Описание
00h Сброс дисководы
01h Проверить Drive Status
02h Читать секторы
03h Написать секторы
04h Проверка секторов
05h Формат дорожки
08h Получить параметры привода
09h Init фиксированных параметров привода
0Ch Стремитесь Указанной Track
0Dh Сброс контроллера Fixed Disk
15h Получить Тип привода
16h Получить Дисковод Медиа Изменить статус
17h Установить диск Тип
18h Установить тип дисковода гибких дисков Медиа
41h Extended Disk Drive (EDD) Установка Проверка
42h Расширенные Сектора прочитанных
43h Расширенные записи секторов
44h Расширенная Проверка секторов
45h Блокировка / разблокировка привода
46h Выброс СМИ
47h Расширенное Seek
48h Расширенные параметры Get Drive
49h Расширенный Get Медиа Изменить статус
4Eh Расширенная настройка оборудования Set
14h услуги через последовательный порт
AH Описание
00h Последовательный порт Initialization
01h Передача Character
02h Прием Character
03h Статус
15h Различные системные службы
AH AL Описание
00h Включите кассетные приводной двигатель (IBM PC / только PCjr)
01h Выключите кассетный приводной двигатель (IBM PC / PCjr только)
02h Читайте блоки данных из кассеты (только IBM PC / PCjr)
03h Написать блоки данных на кассету (только IBM PC / PCjr)
4Fh Клавиатура Intercept
83h Подождите события
84h Читайте джойстик (БИОС с 1986 и далее)
85h SysReq Key Выноска
86h Подождите
87h Переместить блок
88h Получить Extended Memory Size
89h Переключение в защищенный режим
C0h Получить параметры системы
C1h Получить расширенный сегмент данных BIOS Area
C2h Указав Функции устройства
C3h только PS / 2 системы — сторожевой таймер Функции
C4h Программируемые опции Select — MCA шины PS 2 только системы /
D8h EISA Функции системы — только системы шин EISA
E8h 01h Получить размер расширенной памяти (новые функции, начиная с 1994 года). Дает результаты для размера памяти выше 64 Мб.
E8h 20h Система запроса Адрес Карта. Информация , возвращаемая E820 заменяет то , что возвращается из старых AX=E801h и AH=88h интерфейсов.
16h услуги клавишные
AH Описание
00h Читать Character
01h Считывание состояния
02h Читайте клавиатуры Shift, статус
05h Магазин Keystroke в буфер клавиатуры
10h Читать Character Extended
11h Read Input Status Extended
12h Read Keyboard Смена статуса Extended
17h услуги для принтеров
AH Описание
00h Печать символов для принтера
01h Инициализировать принтер
02h Проверка состояния принтера
18h Выполнить Cassette BASIC : На машинах IBM до начала PS / 2 линии, это прерывание начнет ПЗУ Cassette BASIC. Клоны не имеют эту функцию и различные машины / БИОС будет выполнять различные действия , если INT 18h был выполнен, наиболее часто отображается сообщение об ошибке , что нет загрузочного диска не был. Современные машины будут пытаться загружаться из сети через это прерывание.
19h После процедуры POST это прерывание используется BIOS для загрузки операционной системы. Программа может назвать это прерывание, чтобы перезагрузить компьютер (но должны гарантировать, что аппаратные прерывания или операции DMA не приведет к зависанию системы или аварии либо во время повторной инициализации системы с помощью BIOS или в процессе загрузки).
1Ah Real Time Clock Услуги
AH Описание
00h Читать RTC
01h Установить RTC
02h Читать RTC Время
03h Установить RTC Время
04h Читать RTC Дата
05h Набор RTC Дата
06h Установить RTC Alarm
07h Сброс RTC Alarm
1Ah PCI Services — реализованный БИОС с поддержкой PCI 2.0 или более поздней версией
AX Описание
B101h Установка PCI Проверить
B102h Найти PCI устройства
B103h Найти PCI Код класса
B106h Шина PCI-конкретные операции
B108h Read Byte Configuration
B109h Читайте Слово конфигурации
B10Ah Читать DWord конфигурации
B10Bh Написать Byte Configuration
B10Ch Написать слово конфигурации
B10Dh Написать DWord конфигурации
B10Eh Получить IRQ плановую информацию
B10Fh Установка PCI IRQ
1Bh Ctrl-Break обработчик — вызывается , INT 09 когда Ctrl- Перерыв был нажат
1Ch Таймер обработчик клещ — вызывается INT 08
1Dh Не будет называться; просто указатель на ВПТ (Video Parameter Table), в котором содержатся данные о режимах видео
1Eh Не будет называться; просто указатель на ДПТ (Дискета Таблица параметров), содержащий разнообразную информацию, касающуюся дисководы гибких дисков
1Fh Не будет называться; просто указатель на VGCT (V >80h в FFh
41h Адрес указатель: FDPT = Fixed Disk Parameter Table (первый жесткий диск)
46h Адрес указателя: FDPT = Fixed Disk Parameter Table (второй жесткий диск)
4Ah Вызывается RTC для сигнализации

INT 18h : Выполнить BASIC

INT 18h традиционно прыгнул на реализацию Cassette BASIC (представленную Microsoft) , хранящейся в дополнительных ПЗУ . Этот вызов, как правило , вызывается , если BIOS не удалось идентифицировать любой загрузочный тома диска при запуске.

В то время оригинальный IBM PC (IBM тип компьютера 5150) был выпущен в 1981 году, BASIC в ПЗУ является ключевым элементом. Современные популярные персональные компьютеры , такие как Commodore 64 и линия Apple II также имели Microsoft Cassette BASIC в ПЗУ (хотя Commodore переименовала свою лицензионную версию Commodore BASIC), так и в значительной части предполагаемого рынка, IBM PC необходим BASIC , чтобы конкурировать. Как и в этих других системах, ПЗУ на IBM ПК BASIC служил в качестве примитивной бездисковых операционной системы, что позволяет пользователю загружать, сохранять и запускать программы, а также писать и совершенствовать их. (Оригинальный IBM PC был единственной моделью ПК от IBM , который, как и его два вышеупомянутых конкурентов, включено кассета аппаратного интерфейса. Базовая модель IBM PC имела только 16 KiB оперативной памяти и никаких дисков [ любого рода ], поэтому кассету интерфейс и BASIC в ПЗУ были необходимы , чтобы базовая модель полезной из пяти 8 микросхем ROM KiB в оригинальной IBM PC, в общей сложности 40 KiB, четыре содержат BASIC и только один содержит BIOS,. ПЗУ BASIC счета в течение более половины общий объем системной памяти [4 / 7ths, чтобы быть точным].)

Поскольку время продолжалось и BASIC больше не поставляется на всех компьютерах, это прерывание будет просто выводить сообщение об ошибке, указывающее, что нет загрузочного тома не было найдено (как известно, «Нет ROM BASIC», или более пояснительные сообщения в более поздних версиях BIOS); в других версиях BIOS она предложит пользователю вставить загрузочный объем и нажмите клавишу, а затем после того, как пользователь нажал клавишу он будет цикл обратно к начальной загрузки (INT 19h), чтобы попытаться снова загрузиться.

Digital, Радуга 100 B используется INT 18h для вызова ее BIOS, которая несовместима с IBM BIOS. Turbo Pascal , Turbo C и Turbo C ++ переориентированы INT 18 для выделения памяти и подкачки. Другие программы также повторно использовать этот вектор для своих собственных целей.

крючки BIOS

В системах DOS, IO.SYS или IBMBIO.COM крючки INT 13 для обнаружения гибкого изменения диска, отслеживание форматирования вызовов, исправляющих ошибки краевых DMA и рабочих вокруг проблем в ROM BIOS от IBM «01/10/84» с моделью кодом 0xFC перед первый звонок.

Игнорирование BIOS

Многие современные операционные системы (такие как Linux и более новые версии ОС Windows ) обойти встроенную в BIOS системы прерываний связи в целом, предпочитая использовать свое собственное программное обеспечение для управления подключенного оборудования напрямую. Оригинальный Причина этого в первую очередь , что эти операционные системы работают процессор в защищенном режиме, тогда как при вызове BIOS требует переключения в режим реального времени и обратно, и переключение в режим реального времени медленно. Тем не менее, есть и серьезные соображения безопасности не переключаться в режим реального времени, а код BIOS имеет ограничения как в функциональности и скорости , которые мотивируют операционная система дизайнеров , чтобы найти замену для него. На самом деле, ограничение скорости этого BIOS сделало общим даже в эпохе DOS для программы , чтобы обойти его, чтобы избежать его ограничения производительности, особенно для видео графического дисплея и быстрой последовательной связи. Проблемы , связанные с функциональными возможностями BIOS включают в себя ограничение в диапазоне функций , определенное, несогласованность в подмножествах этих функций , поддерживаемых на разных компьютерах, и вариацию в качестве биосов (т.е. некоторые БИОС являются полными и надежными, другими сокращенными и глючит). Принимая дело в свои руки и избежать зависимости от BIOS, разработчики операционных систем могут устранить некоторые из рисков и осложнений , с которыми они сталкиваются в письменной форме и поддержке программного обеспечения системы. С другой стороны, тем самым эти разработчики стали ответственными за предоставление «голое железо» программное обеспечение драйвера для каждой другой системы или периферийного устройства , они намереваются для своей операционной системы для работы с (или для стимулирования производителей аппаратных средств , чтобы обеспечить эти драйверы). Таким образом , должно быть очевидно , что компактные операционные системы , разработанные на небольших бюджетах будут склонны использовать BIOS в значительной степени, в то время как большие операционные системы , построенные огромных группами инженеров программного обеспечения с большими бюджетами будут чаще предпочитают писать свои собственные драйвера вместо BIOS, то есть , даже без учета проблем совместимости из BIOS и защищенного режима.

«Assembler IBM PC 8. Лабораторная работа № 3. Применение сервисных функций BIOS для работы с экраном и клавиатурой»

8.1. ЦЕЛЕВЫЕ УСТАНОВКИ

¨ Вывод текста на экран путём непосредственного программирования видеобуфера.

¨ Разработка прикладных программ с использованием сервисных функций BIOS для работы с экраном и клавиатурой.

¨ Введение задержки для программных операций.

8.2. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

8.2.1. ВВЕДЕНИЕ

В работе № 2 были рассмотрены различные системные функции DOS вывода на экран символьной информации. Однако возможности DOS весьма ограничены: она не имеет функций для изменения цвета выводимых символов и позиционирования курсора. Кроме того, в DOS отсутствуют средства формирования графических изображений.

Все возможности видеосистемы компьютера можно реализовать с помощью видеофункций BIOS прерывания int 10h. Прерывание int 10h обеспечи-вает: смену видеорежима (текстовый или графический); вывод символьной и текстовой информации; смену шрифтов, настройку цветовой палитры, работу с графическим изображением. Программирование видеосистемы с помощью средств BIOS более громоздко, однако большие возможности и высокая скорость вывода обуславливают широкое использование этого метода в прикладных программах.

В данной работе рассматриваются функции BIOS [10, 12] для обслуживания видеосистемы компьютера, а также функции для работы с клавиатурой. Перечислим функции, являющиеся предметом рассмотрения в лабораторной работе.

Int 10h:

функция 00h – установка видеорежима;

функция 02h – установка позиции курсора;

функция 03h – считывание позиции и размера курсора;

функция 05h – установка видеостраницы;

функция 06h (07h) – инициализация или прокрутка окна вверх (вниз);

функция 08h – чтение символа и атрибута в позиции курсора;

функция 09h – запись символа и атрибута в позицию курсора;

функция 0Ah – запись символа в позицию курсора с текущим атрибутом;

функция 0Eh – запись символа в режиме телетайпа с текущим атрибутом;

функция 0Fh – получить режим дисплея;

функция 1003h – переключение назначения старшего бита байта атрибута: мерцание/яркость,

функция 13h – запись строки с заданным атрибутом в режиме телетайпа.

Int 16h:

функция 00h (10h) – чтение символа с клавиатуры с ожиданием;

функция 01h (11h) – проверка буфера клавиатуры на наличие в нём символа;

функция 02h (12h) – получение флагов (расширенной) клавиатуры.

Int 15h, функция 86h – задержка.

Int 1Ah, функция 00h – получение системного времени.

8.2.2. ПРЯМОЕ ПРОГРАММИРОВАНИЕ ВИДЕОБУФЕРА В ТЕКСТОВОМ РЕЖИМЕ

Современные видеоконтроллеры поддерживают разнообразные текстовые и графические режимы. Текстовые режимы различаются по разрешению (число отображаемых символов по горизонтали и вертикали) и цветовой палитре (монохромный или 16-цветный режим). Для графических режимов основным признаком классификации является количество одновременно отображаемых цветов и, соответственно, количество бит видеопамяти, отводимое на каждую точку (пиксел) изображения. Различают следующие типы графических режимов:

– монохромный (1-битное кодирование);

– 16-цветный EGA/VGA (4-битное кодирование);

– 256-цветный SVGA (8-битное кодирование);

HiColor (16-битное кодирование);

TrueColor (24-битное / 32-битное кодирование).

Графические режимы VGA (SVGA) сильно устарели, а текстовые продолжают успешно применяться (см. табл. 3.2 п. 8.2.3).

Всё, что изображено на мониторе – графика, текст – одновременно присутствует в памяти, встроенной в видеоадаптер. Для того чтобы изображение появилось на мониторе, оно должно быть записано в память видеоадаптера. В текстовом режиме для VGA-совместимых систем для видеопамяти отводится адресное пространство (исключая 7-й видеорежим с монохромным адаптером), начинающееся с логического адреса B800h:0000h и заканчивающееся адресом BF00h:0FFFh. Данная область разбивается на 8 секторов по числу видеостраниц (4 Кбайта на страницу). Таким образом, постраничное деление адресного пространства видеопамяти в текстовом режиме имеет следующий вид:

– B800h:0000h – страница 0, смещение в диапазоне 0000h – 0FFFh

– B900h:0000h – страница 1, смещение в диапазоне 0000h – 0FFFh

– BF00h:0000h – страница 7, смещение в диапазоне 0000h – 0FFFh

На экране отображается видеобуфер, соответствующий активной странице. В текстовых режимах для изображения каждого символа отводится 2 байта: байт с ASCII-кодом символа и байт с его атрибутом. При этом по адресу B800h:0000h находится байт с кодом символа (левый верхний угол экрана), а в B800h:0001h – атрибут этого символа; B800h:0002h – код второго символа, а в B800h:0003h – атрибут второго символа и т.д. Вообще при формировании изображения непосредственно в видеобуфере, в обход программ DOS и BIOS, все управляющие коды ASCII теряют свои управляющие функции и отображаются в виде соответствующих символов. Структура байта атрибутов приведена на рис. 3.1.

Рис. 3.1. Структура байта атрибутов

Из рис. 3.1 следует, что каждый символ может принимать любой из 16 возможных цветов, определяемых сочетанием младших 4-х битов. Биты 4-6 байта атрибутов задают цвет фона под данным символом. Последний бит 7, в зависимости от режима видеоадаптера, определяет либо яркость фона под данным символом (тогда фон также может принимать 16 разных цветов), либо мерцание символа (устанавливаетсяDOS по умолчанию).

При загрузке машины устанавливается стандартная палитра, коды цветов которой приведены в табл. 3.1. Рассмотрим некоторые примеры. Так, в режиме мерцания значение старшего полубайта атрибута 8hобозначает не серый фон, а чёрный при мерцающем символе, цвет которого по-прежнему определяется младшим полубайтом; значение старшего полубайта 0Ch – красный фон при мерцающем символе. Переключение назначения бита 7 осуществляется подфункцией 03h функции 10h прерывания int 10h.

Коды цветов стандартной палитры

Двухбайтовые коды символов записываются в видеобуфер в том порядке, в каком они должны появиться на экране: первые 80*2 байт соответствуют первой строке экрана, вторые 80*2 байт – второй и т.д. При этом переход на следующую строку экрана определяется не управляющими кодами возврата каретки и перевода строки, а размещением кода в другом месте видеобуфера. Для того чтобы из программы получить доступ к видеобуферу, надо занести в один из сегментных регистров данных сегментный адрес видеобуфера. После этого, задавая те или иные смещения, можно выполнить запись в любые места (ячейки) видеобуфера. Вычислить смещение ячейки в координатах «строка-столбец» (row, clm) можно так:

При большом объёме выводимых данных, информационный кадр формируется заранее в буфере пользователя, располагающегося в сегменте данных программы.

Листинг 3.1. Запись строки в видеобуфер 0-страницы.

;Настроим сегментный регистр ES на страницу 0 видеобуфера, а ds на сегмент данных

;Перешлём в видеобуфер строку символов, настроив соответствующим образом

;регистры si, di и cx

mov si,offset msg ;Смещение источника

mov di,160*12+36*2 ;Смещение приёмника (36 столбец 13 -ой строки),

mov cx,msglen ;Число пересылаемых байт

cld ;Просмотр вперёд

rep movsb ;)* ;Переслать строку символов с атрибутами в видеобуфер

;Остановим программу для наблюдения результата (иначе после завершения программы

;запрос DOS на ввод команды может затереть выведенную информацию)

;Поля данных в сегменте данных программы. Символы и атрибуты: 0B0h – cветло-

;бирюзовый по чёрному, 0E4h –красный по жёлтому

msg db ‘*’,0B0h,’T’,0E4h,’E’,0E4,’S’,0E4,’T’,0E4,’*’,0B0h

В данном фрагменте программы символьные коды выводимого сообщения перемежаются с их атрибутами. Такой способ формирования полей данных, предназначенных для прямой записи в видеопамять, становится громоздким, однако его можно существенно упростить, если выводимые символы имеют одни и те же атрибуты. Так, если мы хотим осуществить вывод символов текста из сегмента данных с единственным атрибутом 0E4h, то нам нужно просто заменить одну командную строку, отмеченную в выше приведённом фрагменте символом «*)», на три. При этом задание строки данных приобретёт привычный для нас вид.

mov si,offset msg ;Смещение источника


mov di,160*12+36*2 ;Смещение приёмника (36 столбец 13 -ой строки),

mov cx,msglen ;Число пересылаемых байт

cld ;Просмотр вперёд

mov ah,0E4h ;Атрибут выводимых символов 0E4h – красный по жёлтому

cycle: lodsb ;Загрузка в al очередного символа (al ← ds:si)

stosw ;Выгрузка “символ + атрибут” из ах в видеобуфер (ax→es:di)

loop cycle ;Повторить msglen раз

;Поля данных в сегменте данных программы.

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

Разработка структуры программ, осуществляющих просмотр произвольных видеостраниц, на которые предварительно записана информация способом прямого программирования видеобуфера, удобно производить с применением функции 05h int 10h BIOS (п. 8.2.3.2).

8.2.3. СПРАВОЧНЫЕ ДАННЫЕ ПО ФУНКЦИЯМ BIOS

8.2.3.1. Прерывание int 10h. Видеофункции BIOS

¨ Функция 00h. Установка видеорежима (табл. 3.2) текущей видеостраницы с очисткой экрана (быстрая очистка экрана реализуется функцией 06h и 07h).

Al = видеорежим (код режима задаётся в младших 7 битах, установка в 1 старшего бита запрещает очистку экрана).

Текстовые видеорежимы и страницы в стандарте VGA, поддерживаемые
современными видеоконтроллерами

Режим

Тип

Разрешение

Цвет

Размер знака

Адрес

Страницы

3

text

80×25

16/8

9×16

B8000

0 – 7

3 (Mono)

По умолчанию в DOS используется режим 3 (впрочем, корректно оформленная программа должна выполнять проверку или установку требуемого текстового режима с последующим восстановлением прежнего).

¨ Функция 02h. Установка позиции курсора.

Задаёт положение курсора на экране в текстовых координатах, с которых в дальнейшем будет выводиться текст. Отсчёт номера строки и столбца ведётся от верхнего левого угла. Курсор можно установить как в текстовом, так и в графическом режиме, однако, в графическом режиме курсор не виден. BIOS поддерживает до восьми независимых курсоров – по одному на каждую страницу (см. табл. 3.2) независимо от того, какая страница является активной. Функцию 02h BIOS можно использовать в комбинации с функциями DOS для организации вывода на экран.

Вызов: AH = 02h; BH = номер страницы (0,1. 7), обычно 0;

¨ Функция 03h. Считывание позиции и размера курсора.

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

Вызов: AH = 03h, BH = номер страницы (0,1. 7), обычно 0.

Возврат: DH, DL = строка и столбец текущей позиции курсора,

CH, CL = первая и последняя строки развёртки курсора.

Вызов разрушает регистры AX, BP, SI и DI.

¨ Функция 05h. Установка видеостраницы.

Устанавливает активную видеостраницу (как текстовую, так и графическую).

Вызов: AH= 05h, AL= номер страницы (0. 7).

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

¨ Функция 06h (07h). Инициализация или прокрутка окна вверх (вниз).

Инициализирует окно с указанными координатами, пробелами ASCII с заданным атрибутом (AL = 0), или прокручивает содержимое окна вверх (вниз) на заданное число строк (AL = число строк). При прокрутке появляющиеся снизу (сверху) строки заполняются пробелами ASCII с заданным атрибутом. Функцию удобно использовать для быстрой очистки экрана или некоторого прямоугольного окна.

AL = 0 – очистка, AL = N (N >0) – прокрутка на N строк;

BH = атрибут символов в окне;

CH, CL = координаты строки и столбца (Y,X) левого верхнего угла;

DH, DL = координаты строки и столбца (Y,X) правого нижнего угла.

¨ Функция 08h. Чтение символа и атрибута в текущей позиции курсора на выбранной странице.

Вызов: AH = 08h, BH = номер страницы (0. 7), обычно 0.

Возврат: AH = атрибут символа, AL = ASCII-код символа.

Вызов разрушает регистры BP, SI и DI.

¨ Функция 09h. Запись символа с заданным атрибутом на экран в позицию курсора. Действует как в графическом, так и в текстовом режимах. В графическом режиме символы не должны переходить на следующую строку. Все коды в AL рассматриваются как символьные и не управляют положением курсора. После вывода символа курсор смещается к следующей позиции функцией 02h. Коэффициент повторения позволяет выводить строки одинаковых символов. В текстовом режиме символ выводится с указанным в BL атрибутом. В графическом – содержимое BL влияет только на цвет символа, но не на фон под ним. Графическое изображение под знакоместом затирается.

Вызов: AH =09h, AL = ASCII-код символа,

BL = атрибут символа (текстовый режим) или только цвет символа (графический режим),

BH = номер страницы (0,1. 7), CX = коэффициент повторения.

¨ Функция 0Ah. Запись символа с текущим атрибутом на экран в позицию курсора. Функция действует как в графическом, так и в текстовом режимах. Символ принимает атрибут, установленный ранее для этой позиции. Все ASCII-коды в AL рассматриваются как символьные и не управляют положением курсора (также как и в функции 09h). После вывода символа курсор смещается к следующей позициифункцией 02h.

Вызов: AH = 0Ah, AL = ASCII-код символа,

BH = номер страницы (0,1. 7), CX = коэффициент повторения.

¨ Функция 0Eh. Запись символа с текущим атрибутом в режиме телетайпа.

Записывает символ ASCII в позицию курсора (предварительно установленную функцией 02h) на активной странице и смещает курсор к следующей позиции. Коды ASCII: 07h – звонок (BEL), 08h – шаг назад(BS), 0Dh – возврат каретки (CR), 0Ah – перевод строки (LF), рассматриваются как управляющие и выполняются соответствующие им действия. Остальные управляющие коды рассматриваются как символы и выводятся на экран. Действует автоматический перевод курсора на следующую строку после завершения предыдущей, а также прокрутка экрана вверх на 1 строку после заполнения самой нижней.

Вызов: AH = 0Eh, AL = ASCII-код символа,

BL = цвет символа (только для графического режима),

BH = номер страницы (0,1. 7), по умолчанию действует активная страница.

¨ Функция 0Fh. Получить режим дисплея и номер текущей страницы.

Возврат: AL = режим дисплея, AH = ширина экрана в текстовом формате

BH =номер активной страницы.

Вызов разрушает регистры BP, SI и DI.

Пример. Процедура установки позиции курсора на текущей странице.

Вход: dh = строка (0 – 25), dl = столбец (0 – 79)

. ;Сохранить регистры (по необходимости)

. ;Восстановить регистры

¨ Функция 10h. Подфункция 03h. Переключение бита «мерцание/яркость».

Определяет назначение старшего бита 7 атрибута символа: мерцание символа или повышенная яркость фона.

Вызов: AX = 1003h, BL = назначение 7-го бита атрибута:

0 – повышенная яркость, 1 – мерцание (устанавливается по умолчанию).

Функция воздействует сразу на все символы экрана, у которых установлен старший бит атрибута фона.

¨ Функция 13h. Запись строки символов с заданными атрибутами.

Записывает строку в текущую страницу видеобуфера, начиная с указанной позиции. Коды ASCII: 07h – звонок, 08h – шаг назад, 0Ah – перевод строки,
0Dh – возврат каретки, рассматриваются как управляющие, остальные – как символьные.

Вызов: AH = 13h, AL = режим записи:

0 – атрибут символа в BL, строка содержит только коды символов, после записи курсор принимает исходное положение (т.е. вывод следующей строки, если не изменить позицию курсора, начинается с изначально установленной позиции);

1 – отличается от режима 0 тем, что после записи курсор остаётся в конце строки;

2 – строка содержит попеременно коды символов и атрибутов (т.е. каждый символ описывается 2 байтами – ASCII-кодом и атрибутом), после записи курсор принимает исходное положение;

3 – отличается от режима 2 тем, что по окончании вывода курсор остаётся в конце строки.

BH = номер страницы (0,1. 7), BL = атрибут для режимов 0 и 1,

CX = длина символьной строки (в длину входят только коды символов, но не байты атрибутов),

DX = DH.DL = координаты курсора (строка, столбец) в исходной точке вывода строки на экране,

ES:BP = адрес начала строки в памяти.

Обратите внимание на особенность задания адреса!

8.2.3.2. Рекомендации по использованию видеосервиса BIOS

1. Программы (учебный практикум), выполняемые в операционной среде DOS, используют по умолчанию текстовый режим 3, страницу 0.

2. Программы более широкого назначения должны запрашивать текущий видеорежим и страницу (функция 0Fh, int 10h) с последующим их применением в используемых функциях BIOS.

Mov ah,0Fh ;Запрос текущего режима

Mov v_mode, al ;Сохраним режим

Mov current_page, bh ;Сохраним строку

3. Если программа выводит изображение на разные страницы, то последовательность действий с каждой страницей может быть следующей (предполагается режим по умолчанию с «0» – страницей):

– установка страницы функцией 05h;

– установка позиции курсора функцией 02h;

– построчное форматирование текста BIOS или DOS.

В дальнейшем может быть организован циклический просмотр содержания страниц путём их переключения функцией 05h, int 10h. При выходе из программы обязательно восстанавливаем искомую «0»-страницу. Сделать это, к примеру, можно так.

;Анализ буфера клавиатуры функцией DOS 06h int 21h с целью её завершения нажатием ;произвольной клавиши

mov ah,06h ;Функция ввода без ожидания

mov dl,0FFh ;Ввод

jnz out_program ;zf=0, есть символ, на выход

jmp continue ;zf=1, символа нет, продолжим работу

out_program: ;Восстановим страницу функцией 05h, int 10h

exit: mov ax,4C00h ;Вызов функции завершения программы

Страницы видеобуфера могут быть последовательно отформатированы и способом непосредственного программирования памяти. Выбор страниц при этом осуществляется соответствующей инициализацией сегментного регистра ES (см. п. 8.2.2). Просмотр содержимого страниц также может быть выполнен путём их последовательного переключения с помощью функции 05h, int 10h.

4. Структура демонстрационной программы, исследующей функцию «мерцание – яркость фона» (функция 10h, подфункция 03h, int 10h).

;Инициализация 2-х локальных окон, каждое со своим атрибутом и текстом. При задании

;атрибутов цвета старший (7-ой по номеру) бит выбран равным «1».

continue: ;Включим мерцание

mov bl,1 ;Мерцание

;Введём задержку на 3 сек

;Включим повышенную яркость

;Введём задержку на 3 сек

;Анализ буфера клавиатуры функцией DOS 06h int 21h с целью её завершения нажатием

jnz out_program ;zf=0, есть символ, на выход

jmp continue ;zf=1, символа нет, продолжим работу

out_program: ;Восстановим мерцание (по умолчанию)

exit: mov ax,4C00h ;Вызов функции завершения программы

5. Если в программе организован бесконечный цикл вывода данных на экран функциями BIOS (09h, 0Ah, 0Eh, 13h), то его нельзя будет аварийно прервать с помощью нажатия клавиш Ctrl+C (т.е. выйти из программы, как это можно сделать при использовании соответствующих функций DOS). Чтобы можно было это сделать, включите в тело цикла функцию 0Bh прерывания Int 21h.

8.2.3.3. Прерывание int 16h

¨ Функция 00h (10h). Чтение символа клавиатуры с ожиданием.

Читает из кольцевого буфера ввода символ и скан-код. После считывания они удаляются из буфера и возвращаются в регистре AX. Если буфер пуст, ожидает ввода. Каждой клавише на клавиатуре соответствует так называемый скан-код, соответствующий только этой клавише. Этот код посылается клавиатурой при каждом нажатии и отпускании клавиши и обрабатывается в BIOS обработчиком прерывания Int 09h. Функция 00h даёт возможность получить код нажатия, не перехватывая этот обработчик. Если нажатой клавише соответствует ASCII-символ, то:

AL – ASCII-код символа, AH – скан-код клавиши.

Если нажатой клавише соответствует расширенный ASCII-код, то:

Возврат: AL = ASCII-код символа, изображённый на клавише/00h,

AH = скан-код/расширенный ASCII-код клавиши.

Функция 10h (AH = 10) – усовершенствованный вариант функции 00h для расширенной клавиатуры (101/102-key). Позволяет получить расширенные
ASCII-коды для клавиш F11, F12, а также для ряда других комбинаций.
В качества признака управляющих клавиш или их комбинаций, помимо значения 00h, используются 0Ah, 0Dh и E0h.

¨ Функция 01h (11h). Поверка буфера клавиатуры на наличие в нём символа.

Определяет, имеются ли в кольцевом буфере ожидающие ввода символы; возвращает флаг ожидания и сам символ при его наличии. Однако символ и его скан-код не извлекаются из буфера и могут быть снова получены при повторном вызове функции 00h Int 16h. Данная функция относится к числу асинхронных: определив состояние буфера ввода, она возвращает управление про-
грамме.

Возврат: ZF = 1, если буфер пуст и ZF = 0, если в буфере имеется ожидающий считывания символ. В этом случае:

AL = ASCII-код символа/00h, AH = скан-код клавиши/расширенный ASCII-код.

Функция 11h (AH = 11h) – усовершенствованный вариант функции 01h для расширенной клавиатуры (101/102-key). Позволяет получить расширенные ASCII-коды для клавиш F11, F12, а также для ряда других комбинаций. В качестве признака управляющих клавиш или их комбинаций, помимо значения 00h, используются 0Ah, 0Dh и E0h.

¨ Функция 02h (12h). Получение флагов клавиатуры.

Возвращает байт флагов клавиатуры, описывающих состояние управляющих клавиш, записанное в байте (слове) области данных BIOS по адресу 0000h:0417h.

Возврат: A L=1-ый байт флагов клавиатуры.

Биты байта имеют следующие значения:

0: 1 – правая Shift нажата

1: 1 – левая Shift нажата

2: 1 – Ctrl (любая) нажата

3: 1 – Alt (любая) нажата

4: 1 – режим Scroll Lock

5: 1 – режим Num Lock

6: 1 – режим Caps Lock

7: 1 – режим Insert активен

Функция 12h (AH = 12h) – усовершенствованный вариант функции 02h для расширенной клавиатуры (101/102-key). Выводит такое же значение байта, как и функция 02h, по адресу 0000h:0417h, и, дополнительно, второй байт статуса клавиатуры (адрес 0000h:0418h) со следующими значениями:

0: 1 – левая Ctrl нажата 4: 1 – нажата Scroll Lock

1: 1 – левая Alt нажата 5: 1 – нажата Num Lock

2: 1 – правая Ctrl нажата 6: 1 – нажата Caps Lock

3: 1 – правая Alt нажата 7: 1 – нажата SysReg

8.2.3.4. Задержка программных операций

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

Листинг 3.2. Программная задержка на основе выполнения вложенных циклов с командой Loop.

Proc delay ;Подпрограмма задержки

Mov cx, N ;N – счётчик внешнего цикла

Outer: push cx ;Сохраним содержание счётчик внешнего цикла

Mov cx,0 ;Обеспечим максимальное число повторений (64К раз)

Inner: loop Inner ;Внутренний цикл

Pop cx ;Восстановим содержание счётчик внешнего цикла

Loop Outer ;Повторим вешний цикл N раз

В листинге 3.2 параметр N выполняет роль масштабного множителя времени задержки

При этом наименьшей единицей времени (т.е. «тиком») является время выполнения внутреннего цикла, состоящего, в свою очередь, из времени исполнения 65535 раз команды Loop. Параметр Nподбирается экспериментально для получения tзад (в мсек или сек) с учётом быстродействия конкретного компьютера.

Из рассмотрения данного примера очевидны недостатки данного подхода, когда требуется обеспечить выполнение временной задержки в программе, независимо от типа используемого компьютера.Поэтому разумно определять время программной задержки непосредственно по таймеру. Выходные сигналы таймера с частотой 18,2 раза в секунду не зависят от производительности компьютера и играют роль счетчика суточного времени. Реализация данного способа использует функцию 00h прерывания BIOS Int 1Ah.

Int 1Аh, функция 00h. Чтение счетчика циклов таймера.

Обработчик прерывания BIOS от системного таймера (Int 8) подсчитывает количество прерываний (каждые 55 мсек или 18,2 раза в секунду) в двойном слове памяти с адресом 0040h:006Сh. Данная функция возвращает накопленное значение (двоичный код) и сбрасывает его в . В регистре AL возвращается , если содержимое счетчика не превысило значения, соответствующего 24 часам (при достижении этого значения счетчик сбрасывается), иначе возвращается AL = 1.

Возврат: СХ:DX – число тактов системного времени от полуночи,

AL – флаг перехода через сутки.

Примеры возвращаемых значений в СХ:DX:

1 сек 12h или 18,

1 минута 04 44h или 1092,

1 час 1 00 07h или 65543,

24 часа 18 00 B0h или 1 573 040.

Для задержек меньших 14 секунд можно пользоваться только младшим байтом регистра DX

Листинг 3.3. B данном примере установлена задержка на 5 секунд, что соответствует 91 отсчету таймера

mov ah,0 ;Функция «чтения» циклов таймера

int 1Ah ;Получаем значение счетчика циклов в cx:dx

add dx,91 ;Добавляем 5 сек. к младшему слову в dx

mov bx,dx ;Запоминаем требуемое значение в bx и выполняем

;постоянную проверку значений счетчика времени суток

repeat: int 1Ah ;Вновь получаем значение счетчика

cmp dx,bx ;Сравниваем с искомым

jne repeat ;Если не равно, то повторяем снова,

;иначе задержка окончена

Если требуется введение задержки с высокой точностью, то необходимо использовать функцию 86h прерывания BIOS Int 15h. Она позволяет определить время задержки в микросекундах. Во время выполнения задержки разрешены прерывания. Управление программе возвращается после истечения заданного времени.

Int 15h, функция 86h

Вызов: AH = 86h, СX:DX = время задержки в мксек.

Возврат: CF = 0 – нормальное исполнение, CF = 1 – функция не поддерживается.

Пример: CX:DX = 0098h:9680h = 10 000 000 мксек = 10 сек.

8.3. ВАРИАНТЫ ИНДИВИДУАЛЬНОГО ЗАДАНИЯ

1. Инициализировать экран с определённым атрибутом. Наложить на него локальное окно меньшего размера с другим атрибутом цвета. В центральную часть окна вывести текст (несколько строк) из памяти с циклической реализацией скроллинга окна в несколько строк вверх и вниз. Смена типа скроллинга задаётся программной задержкой (2. 3 сек.). Предусмотреть выход из программы.

2. Инициализировать две видеостраницы, каждая со своим атрибутом и записанным текстом (некоторые символы текста обязательно должны иметь отличный от других цвет). Организовать циклическую смену видеостраниц с периодом 2. 3 сек. Предусмотреть выход из программы с восстановлением текущей страницы.

3. На экране инициализировать 2 локальных окна. Каждое окно со своим атрибутом и текстом с несколькими строками. Организовать циклическое переключение атрибутов первого окна на второе и обратно. Цикл переключения задаётся временной задержкой в 2. 3 сек. Предусмотреть выход из программы.

4. На экране инициализировать 2 локальных окна. Каждое окно со своим атрибутом и текстом в несколько строк. Организовать циклическое переключение текста из одного окна в другое с временной задержкой 2. 3 сек. Предусмотреть выход из программы.

5. На экране инициализировать окно_1 с атрибутом и текстом в несколько строк. Спустя время задержки 2. 3 сек частично наложить на него окно_2 с другим атрибутом и текстом. Процесс зациклить. Предусмотреть выход из программы.

6. На экране инициализировать локальное окно с атрибутом (и текстом), сообщить ему дрейф в горизонтальном (вертикальном) направлении. При достижении границы экрана окно изменяет дрейф в противоположную сторону. Шаг движения локального окна в пространстве экрана должен быть во много раз меньше размеров самого экрана.

7. На экране инициализировать локальное окно с атрибутом (и текстом). После нажатия командной клавиши окно начинает изменять свои размеры (пульсировать), увеличиваясь и уменьшаясь с определённым периодом. Временной шаг изменения размера окна должен быть много меньше периода
пульсации.

8. Инициализировать экран и локальное окно в нём со своими атрибутами. Организовать режим вывода текста в локальное окно с клавиатуры. Предусмотреть возможность редактирования текста, а также скроллинга окна при его заполнении.

9. Инициализировать экран и два небольших локальных окна в нём. С помощью клавиши организовать переключение курсора из одного окна в другое. Выбранное клавишей окно приобретает повышенную яркость. Предусмотреть выход из программы.

10. Инициализировать экран и два локальных окна в нём. В левое окно вывести первую половину таблицу ASCII, а в правое – вторую половину. Предусмотреть очистку окон и выход из программы.

11. Инициализировать экран и два локальных окна в нём (каждое со своим атрибутом и текстом). Организовать циклическое переключение бита «яркость фона/мерцание». Выход из программы должен восстанавливать значение бита по умолчанию.

12. Инициализировать экран и два локальных окна в нём. В левое окно вывести вторую половину таблицы ASCII c символами псевдографики. Используя навигацию курсора, c помощью клавиш (¬,­,®,¯)организовать возможность непрерывного воспроизведения прямых линий во втором окне.

13. Разработать программу вывода текста на экран путём непосредственного программирования видеобуфера с использованием элементов форматирования (отступ от левой границы, перенос текста на следующую строку после пересечения словом правой границы).

CX – число выводимых символов;

Indent_L, Indent_R – поля отступа (в столбцах) слева и справа.

Необходимо оптимизировать расчёт адреса видеобуфера ES:DI. Процедура должна возвращать исходное значение регистра ES.

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


15. Разработать программу рисования прямоугольника, используя графические символы в кодировке ASCII. Координаты верхнего левого угла (строка, столбец) и нижнего правого должны вводиться с клавиатуры после соответствующего приглашения.

8.4. КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Краткая характеристика возможностей, предоставляемых программисту базовой системой ввода-вывода BIOS, в сравнении с сервисными функциями DOS.

2. Назовите объём видеопамяти для изображения одного символа и, соответственно, одной видеостраницы монитора в текстовом режиме.

3. Дайте характеристику атрибута символа в видеобуфере.

4. Разработайте макросы для:

¨ очистки экрана с установкой курсора в левый верхний угол экрана;

¨ позиционирования курсора в произвольную точку экрана с запоминанием его координат в памяти с помощью переменных row и clm;

¨ вывода сообщения mes длиною leng и атрибутом цвета attrib с позиции, определяемой переменными row и clm.

5. Какая функция BIOS предоставляет пользователю исчерпывающую информацию о нажатой клавише клавиатуры.

Применение системных функций в задачах программирования (стр. 1 )

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3

Федеральное агентство по образованию

Государственное образовательное учреждение

УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ

ПРИМЕНЕНИЕ СИСТЕМНЫХ ФУНКЦИЙ

В ЗАДАЧАХ ПРОГРАММИРОВАНИЯ

Применение системных функций в задачах программирования. Лабораторный практикум по дисциплине «Системное программное обеспечение» / Уфимск. гос. авиац. техн. ун-т.

Сост.: . – Уфа, 2008. – 57 с.

Приведены сведения о принципах взаимодействия аппаратных и программных средств персонального компьютера IBM PC и способах выполнения основных системных функций. Рассматриваются процедуры низкоуровневого программирования на базе основных экранных и клавиатурных функций. Рассматриваются возможности системной программы DEBUG для выполнения и отладки программ. Изучается система программирования TASM для трансляции и компоновки программ на языке ASSEMBLER. Практическое применение иллюстрируется различными примерами и упражнениями.

Методические указания предназначены для подготовки дипломированных специалистов направления 230100 «Информатика и вычислительная техника», специальности 230102 – «Автоматизированные системы обработки информации и управления».

Библиогр.: 5 назв.

Лабораторная работа №1

ИСПОЛЬЗОВАНИЕ ПРОГРАММЫ DOS DEBUG ДЛЯ ОТЛАДКИ И ТЕСТИРОВАНИЯ ПРОГРАММ. 3

Лабораторная работа №2

УПРАВЛЕНИЕ ВЫВОДОМ ТЕКСТОВОЙ ИНФОРМАЦИИ НА ЭКРАН. 3

Лабораторная работа №3

СИСТЕМНЫЕ СРЕДСТВА ДЛЯ ВЫВОДА ИНФОРМАЦИИ НА ЭКРАН В ГРАФИЧЕСКОМ РЕЖИМЕ. 3

Лабораторная работа №4

ПРОГРАММИРОВАНИЕ СИСТЕМНЫХ ФУНКЦИЙ BIOS И DOS ДЛЯ РАБОТЫ С КЛАВИАТУРОЙ. 3

Список литературы . 44

Программа DEBUG. 3

Трансляция и компоновка программ. 3

ЛАБОРАТОРНАЯ РАБОТА № 1

ИСПОЛЬЗОВАНИЕ ПРОГРАММЫ DOS DEBUG ДЛЯ ОТЛАДКИ И ТЕСТИРОВАНИЯ ПРОГРАММ.

Целью настоящей работы является изучение возможностей системной программы – отладчика DEBUG по программированию компьютера IBM в машинных кодах.

2. Теоретическая часть

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

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

А преобразовать инструкции символьного кода в машинный код;

D показать содержимое области памяти в шестнадцатеричном формате;

Е ввести данные в память, начиная с определенного адреса;

G начать выполнение программы в памяти;

Н выполнить шестнадцатеричные арифметические операции;

N назвать программу;

Р продолжить или выполнить группу связанных инструкций;

Q завершить сеанс работы с DEBUG;

R показать содержимое одного или более регистров в шестнадцатеричном формате;

Т отследить выполнение одной инструкции;

U преобразовать (дизассемблировать) машинный код в символьный.

2.2. Основные особенности программы DEBUG.

• DEBUG не различает строчные и заглавные буквы.

• Все вводимые числа задаются в шестнадцатеричной форме.

• Пробелы используются в командах только для разделения параметров.

• Сегмент и смещение указываются с использованием символа двоеточия, т. е. в форме сегмент:смещение.

Приложение 1 содержит полное описание команд DEBUG, включая инструкции по его запуску.

2.2.1. Команда D (Display — показать) в программе DEBUG

Эта команда выводит содержимое указанной области памяти на экран. Следующие три примера используют команду D для просмотра одного и того же участка памяти, начинающегося со смещения ЗС1H в сегменте кода (CS):

D CS:3C1 (команда набрана заглавными буквами с пробелом);

DCS:3C1 (команда набрана заглавными буквами без пробела);

dcs:3cl (команда набрана строчными буквами без пробела);

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

Команда D выводит 8 строк данных, в каждой из которых по 16 байт (32 шестнадцатеричных разряда), всего – 128 байт, начиная с указанного адреса.

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

Команда D также показывает содержимое регистров и состояние флагов в регистре Flags.

2.2.2. Упражнение 1: просмотр области данных BIOS

Первое упражнение показывает содержимое области данных BIOS в памяти, начиная с адреса 400Н или, более точно, с адреса сегмента 40[0]Н. BIOS инициализирует значения в этой области памяти при включении компьютера и меняет их в ходе выполнения программ.

Просматривайте эти значения при помощи адреса из двух частей: в качестве адреса сегмента (то есть 400, с отброшенным младшим разрядом), и nn в качестве смещения от начала сегмента. Воспринимайте адрес 40:nn как сегмент 40[0]Н плюс смещение nnН.

2.2.3. Проверка параллельных и последовательных портов

Первые 16 байт области данных BIOS содержат адреса параллельных и последовательных портов. Введите следующую команду:

D 40:00 (и нажмите )

Первые четыре выведенных слова указывают на адреса портов от СОМ1 до COM4. Если на компьютере два последовательных порта, первые два слова, вероятно, содержат F803 и F802 в обращенной (с переставленными байтами) последовательности. Последовательные порты имеют адреса 03F8 и 02F8. Следующие 4 слова указывают на параллельные порты от LPT1 до LPT4. Для системы с одним параллельным портом первое слово, вероятно, содержит 7803, т. е. адрес порта – 0378.

2.2.4. Проверка оборудования системы

Слово состояния оборудования в области данных BIOS предлагает базовую информацию о присутствующих в системе устройствах. Это слово, расположенное по адресу 410Н — 411Н, можно просмотреть командой

D 40:10 (и нажмите )

Выведенные строки должны начинаться так:

Допустим, что слово содержитв шестнадцатеричной форме. Чтобы интерпретировать его, переставим байты и преобразуем в двоичную форму:

Позиция бита:12 1 0

Эти биты означают:

15, 14 Число параллельных (принтерных) портов = 1 (двоичное 01)

11 – 9 Число последовательных портов = 2 (двоичное 010)

7,6 Число дисководов = 1 (00 = 1,01 = 2, 10 = 3, 11 = 4)

5,4 Начальный видеорежим == 40×25 цветной,

10 = 80×25 цветной, 11 = 80×25 монохромный)

1 1 = присутствует математический сопроцессор

0 1 = присутствует привод для дискет

Неописанные биты не используются.

2.2.5. Проверка состояния регистра клавиатуры (клавиша Shift)

В области данных BIOS по адресу 417Н хранится первый байт состояния регистра клавиатуры. Убедитесь, что Num Lock и Caps Lock выключены, и просмотрите содержимое байта по этому адресу командой D 40:17.

Результат будет похож на

Теперь включите Num Lock и Caps Lock и введите вновь команду D 40:17. Результат должен начинаться с

2.2.6. Проверка состояния видеоустройства

В области данных BIOS по адресу 449Н находится первая область видеоданных (Video Data Area). Введите команду D 40:49. Первый показанный байт указывает на текущий видеорежим (например, 03 — цветной), а второй – число столбцов на экране (например, 50 означает режим с 80 столбцами). Число строк хранится по адресу 40:84Н.

2.2.7. Упражнение 2: Просмотр ROM BIOS

Сведения об авторском праве BIOS системы встроены в ROM BIOS no адресу FE00:0. В зависимости от производителя компьютера будут выведены различные строки, после которых будет указан семизначный серийный номер. Строка, указывающая на авторство BIOS, легко читается в виде ASCII-последовательности, а серийный номер – в виде шестнадцатеричного числа. Строка с указанием авторских прав может быть длиннее, чем показанный участок памяти; в этом случае для просмотра не показанной части снова введите D и нажмите .

2.2.8. Проверка даты производства BIOS

Эта дата, записанная в виде мм/дд/гг, начинается с адреса FFFF5H. Для ее просмотра введите команду D FFFF:5. Знание этой даты полезно при определении возраста и модели компьютера.

Используя команду D, вы можете просмотреть содержимое любой области памяти. Можно также последовательно просматривать память, просто повторно вводя D – DEBUG будет выводить 128 байт, следующих за последними просмотренными.

Для завершения работы с DEBUG введите Q.

2.2.9. Упражнение 3: Использование непосредственных данных

Воспользуемся DEBUG для ввода первой из двух программ непосредственно в память и наблюдения за ее выполнением. Обе программы включают простые инструкции машинного языка в виде, в котором они находятся в памяти, и позволяют продемонстрировать эффект их выполнения. Выполнение упражнения начинается с команды Е (Enter, ввести).

Первая программа использует непосредственные данные — данные, определенные в теле инструкций. Далее показан как машинный код и соответствующий символьный код с комментариями для улучшения восприятия. Первой инструкции, В82301, соответствует символьный код MOV АХ,0123, заносящий (копирующий) значение 0123Н в регистр АХ (непосредственные данные записываются в прямой, с непереставленными байтами, форме). MOV – инструкция, АХ – ее первый операнд, непосредственное значение 0123Н – второй.

Машинная Символьный код Пояснение

В82301 MOV AX,0123 Переслать значение 012Зh в АХ

052500 ADD AX,0025 Прибавить значение О025h к АХ

8ВD8 MOV BX, AX Переслать содержимое АХ в ВХ

03D8 ADD BX, AX Прибавить содержимое АХ к ВХ

8BCB MOV CX, BX Переслать содержимое BХ в CХ

2BС8 SUB CX, AX Вычесть содержимое AХ из СХ

2ВС0 SUB AX, AX Вычесть содержимое АХ из АХ (очистка АХ)

90 NOP Нет операции

EBEE JMP 100 Переход к началу программы.

Из примера видно, что машинные инструкции имеют длину 1, 2 или 3 байта. Первый байт указывает, собственно, операцию, а все последующие – ее операнды (непосредственные значения, ссылки на регистры или адреса в памяти). Исполнение программы начинается с первой машинной инструкции и последовательно проходит через все инструкции одну за другой.

2.2.10. Ввод инструкций программы

Для того чтобы ввести свою программу непосредственно в память, вводите только машинный код, символьный код и комментарии водить не нужно. Введите команду Е и следующие символы, как показано ниже.

Е CS:100 B8(и нажмите )

CS:100 указывает начальный адрес области, в которой будет храниться введенный код (обычный начальный адрес для машинного кода в программе DEBUG). Команда Е сохранит следующие за ней байты в адресах от CS:100 до CS:105.

Следующая команда Е сохранит еще 6 байт в адресах от CS:106 до CS:10B.

Е CS:106 8В D8 03 D8 8В СВ (нажмите )

Последняя команда Е сохраните 6 байт в адресах от CS:10С до CS:111.

Е CS:10C 2В С8 2В С0 ЕВ ЕЕ (нажмите )

Если вы введете неправильную строку, просто повторите ввод правильно.

2.2.11. Выполнение инструкций программы

Теперь можно выполнить введенные инструкции по очереди. Можно также просматривать содержимое регистров после выполнения каждой инструкции с помощью команд R (registers — регистры) и Т (trace — отследить).

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

DEBUG проинициализировал DS, CS, SS и ES одним и тем же адресом, xxxx[0]. IP должен показывать 0100, указывая, что выполнение инструкций начинается со смещения 100Н относительно начала сегмента кода.

Регистр флагов показывает следующие значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:

NV UP El PL NZ NA PO NC

Эти значения соответствуют слева направо: отсутствию переполнения, направлению вверх (или вправо), разрешению прерываний, положительному знаку, ненулевому значению, отсутствию дополнительного переноса, нечетному слову, и отсутствию переноса. В данный момент эти значения не важны.

Сразу после регистров командой R показана первая, подлежащая выполнению инструкция:

хххх:0100 В82301 MOV АХ,0123

хххх означает начало сегмента кода по адресу хххх[0]Н. Значение хххх:0100 означает смещение 100Н от начала сегмента кода, начинающегося по адресу хххх[0]Н.

В82301 – машинный код, введенный по адресу CS:100.

MOV АХ,0123 – символьная инструкция на языке Ассемблера, определенная DEBUG из машинного кода. Эта инструкция перемещает (копирует) непосредственное значение 0123Н в регистр АХ. DEBUG дизассемблировал машинный код для лучшего его понимания.

Для выполнения инструкции MOV введите команду Т и нажмите . Машинный код команды – В8 (поместить в АХ), операнд – 2301. Операция помещает 23 в младшую половину регистра (AL) и 01 – в старшую (АН).

DEBUG выводит результаты выполнения – эффект, оказанный операцией на содержимое регистров. Регистр IР содержит теперь 0103Н (0100Н плюс 3 байта – длина выполненной инструкции). Это значение указывает на адрес, по которому расположена следующая подлежащая выполнению инструкция, то есть:

Для выполнения этой инструкции вновь введите Т. Инструкция добавит 25Н к младшему байту (AL) регистра АХ и 00Н – к старшему (АН), то есть добавит 0025Н к содержимому АХ. Теперь АХ содержит 0148Н, a IP – 0106Н, указывая на следующую инструкцию, которую необходимо выполнить:

xxxx:0106 8BD8 MOV AX, BX

Вновь введите команду Т. Инструкция MOV заносит содержимое регистра АХ в регистр ВХ. После выполнения инструкции ВХ содержит 0148Н. АХ все еще хранит 0148Н, поскольку инструкция MOV копирует данные, не удаляя их из источника.

Теперь последовательно вводите команды Т для выполнения оставшихся инструкций. Инструкция ADD суммирует содержимое регистров АХ и ВХ, записывая значение 0290Н в регистр ВХ. Затем программа копирует содержимое ВХ в СХ, вычитает АХ из СХ и вычитает АХ из самого себя. Последняя инструкция очищает АХ, устанавливая его в 0, и устанавливает флаг ZF из NZ (nonzero – не нуль) в ZR (zero – нуль), отображая результат операции.

Инструкция JMP устанавливает IP в 100Н, и обработка возвращается обратно к началу программы. Эта инструкция введена из соображений предосторожности, поскольку за последней введенной инструкцией следует «мусор», который при попытке выполнения мог бы вызвать останов процессора или другие нежелательные результаты.

Регистры DS, ES, SS и CS содержат один и тот же адрес сегмента. Это потому, что DEBUG рассматривает весь введенный код как программу. СОМ, хранящую данные, стек и код в одном сегменте, хотя вы и храните их по отдельности внутри сегмента. При написании программы .ЕХЕ стек, данные и код хранятся в отдельных сегментах с разными адресами.

Для повторного выполнения программы введите еще раз команду Т, DEBUG выполнит инструкцию JMP и перейдет к началу введенной программы.

2.2.12. Просмотр содержимого памяти

Для просмотра программы на машинном языке в сегменте кода запросите вывод информации командой D CS:100. Результаты выполнения этой команды представляются строками с 16 байтами (32 шестнадцатеричными разрядами) в каждой строке. Справа – ASCII представление (если соответствующий символ можно вывести) каждого байта. В случае машинного кода ASCII представление бессмысленно и может игнорироваться.

Первая строка начинается со смещения 100Н в сегменте кода и содержит байты с адресами от CS:100H до CS:10FH. Вторая строка выводит байты с адресами от CS:110H до CS:11FH. Хотя введенная программа заканчивается байтом с адресом CS:111H, DEBUG автоматически выводит восемь строк – от CS:100H до CS:170H. В этом примере все данные, следующие за CS:111H – «мусор».

Введите Q для завершения работы с DEBUG или начните выполнение следующего упражнения.

2.2.13. Использование ранее определенных данных

Предыдущий пример использовал непосредственные данные, определенные прямо в директивах MOV и ADD. В этом примере данные (числовые константы 0123Н и 0025Н) определены в виде отдельных элементов данных в программе. Инструкции программы должны работать с ячейками памяти, содержащими эти значения.

Этот пример показывает, как компьютер получает доступ к данным с помощью адреса в регистре DS и смещений. В примере, начиная с адреса DS:0200H, определены следующие элементы данных.

Смещение в сегменте DS Шестнадцатеричный код содержимого

Шестнадцатеричная цифра занимает полбайта, поэтому, например, 23Н хранится в байте с адресом 200Н, а 01H – в следующем (со смещением 201Н). Ниже приведены машинные инструкции, обрабатывающие эти данные, со значениями, введенными в обратной (с переставленными байтами) форме.

А10002 Поместить слово (2 байта), начинающееся с адреса DS:0200H, в

Добавить содержимое слова (2 байта), начинающегося с адреса

DS:0202H, к содержимому регистра АХ

A30402 Поместить содержимое АХ в слово, начинающееся с адреса

EBF4 Перейти к началу программы

Две инструкции по перемещению данных имеют разные машинные коды: А1 и A3. Действительный машинный код инструкции MOV зависит от регистров, на которые ссылается инструкция, размера элемента данных (байт или слово), направления передачи данных (в регистр или из регистра) и того, ссылается инструкция на непосредственные данные, адрес в памяти или регистр.

2.2.14. Ввод инструкций и данных программы

Используйте программу DEBUG для ввода и выполнения программы этого примера. Сначала с помощью команды Е введите инструкции, начиная с адреса CS:0100:

Е CS:100 A102 (и нажмите )

Е CS:107 A3ЕВ F4 (и нажмите )

Теперь (также при помощи команды Е) введите соответствующие значения в ячейки сегмента данных:

Е DS:000 00 (и нажмите )

Е DS:0206 2А 2А 2А (и нажмите )

Первая команда Е сохраняет три слова (6 байт) в начале области данных – начиная со смещения 0200Н. Все эти слова должны быть введены в форме с переставленными байтами, то есть 0123 как 2301 и 0025 как 2500. Когда в дальнейшем инструкция MOV запросит эти слова из памяти, байты будут переставлены опять, образуя исходные значения.

Вторая команда Е вводит в память три символа звездочки (***) в виде кода 2А2А2А. Вы сможете их увидеть в виде символов с помощью команды D.

Для просмотра данных в сегменте (со смещениями от 0200Н до 0208Н) и инструкций в сегменте CS (от 0100Н до 010АН) введите следующие команды D:

Для просмотра кода: 100,10A

Для просмотра данных: 200,208

2.2.15. Выполнение инструкций программы

Введя инструкции, можно выполнять их тем же способом, что и в предыдущем примере. Сначала убедитесь, что IР содержит 0100Н. После этого командой R просмотрите содержимое регистров, флагов и код первой инструкции. Хотя АХ может все еще содержать значение, присвоенное ему в предыдущем примере, оно скоро будет заменено новым. Первая показанная инструкция

хххх:0100 А10002 M0V АХ,[0200]

CS:0100 указывает на первую инструкцию, А10002. DEBUG интерпретирует эту инструкцию как MOV и определяет, что она ссылается на ячейку со смещением [0200Н] в сегменте DS. Квадратные скобки указывают, что это не непосредственное значение, а адрес в памяти. (Непосредственное значение для записи в АХ выглядело бы как MOV AX,0200.)

Теперь введите команду Т. Инструкция выполняется и помещает значение слова со смещения 0200Н в регистр АХ. Содержимое этого слова – 2301Н, а инструкция переставляет байты и помещает его в регистр АХ в виде 0123Н, стирая любое предыдущее значение.

Введите вторую команду Т. Будет выполнена следующая инструкция, т. е. ADD. Операция добавляет значение из слова по адресу DS:0202H к значению регистра АХ. Результат – сумма 0123Н и 0025Н, то есть 0148Н.

Следующая инструкция – MOV [0204],АХ. Введите Т для ее исполнения. Инструкция копирует значение из регистра АХ в слово в памяти, занимающее ячейки с адресами 0204Н и 0205Н. При этом байты будут переставлены, и слово будет содержать значение 4801Н. Для просмотра изменившегося содержимого ячеек памяти введите команду

Выведенные значения должны быть такими:

Значение в ячейке:01 2а 2а 2а

Левая сторона дисплея показывает действительный машинный код так, как он хранится в памяти. Правая сторона помогает легко находить символьные данные. Эти шестнадцатеричные значения представлены в правой части экрана соответствующими им символами ASCII. Коды 23Н и 25Н выводятся как # (символ номера) и % (символ процента) соответственно. Три байта 2АН выводятся как три звездочки (*).

Можно завершить работу с DEBUG командой Q или перейти к выполнению следующего примера.

2.2.16. Повторное выполнение инструкций

Иногда необходимо вручную установить значение в регистре IP. Делается это так.

1. Введите команду R IP для вывода содержимого регистра IP.

2. Введите значение 100 (или адрес другой инструкции), а затем нажмите .

Эта процедура возвращает к началу программы (или к инструкции внутри программы), и можно повторно выполнить уже пройденные шаги. Введите команду R (без IP). DEBUG выведет на экран содержимое регистров, флаги и следующую подлежащую выполнению инструкцию. Теперь можно использовать команду Т для повторного выполнения инструкций. Если программа накапливает значения, используйте команду Е для очистки ячеек памяти и команду R для очистки регистров.

2.2.17. Сохранение программы в DEBUG

Можно использовать DEBUG для сохранения программы на диске в двух случаях.

1. Для получения с диска существующей программы, внесения в нее изменений и последующего сохранения.

2. Для создания при помощи DEBUG маленькой программы в машинных кодах, которую нужно сохранить.

За детальным объяснением обращайтесь к описанию команды W (write — записать) в приложении 1.

На данном этапе может оказаться полезной команда Н, складывающая и вычитающая шестнадцатеричные числа. Максимальная длина чисел – 4 шестнадцатеричных разряда. Например, введите команду Н 3443 2А2В. Команда выведет сначала сумму (5Е6Е), а затем – разность (0А18).

2.2.18. Программа на языке Ассемблера

DEBUG также можно использовать для ввода программ на языке Ассемблера. Рассмотрим команды DEBUG А и U, используемые для ввода выражений на языке Ассемблера в компьютер.

Команда А приказывает DEBUG начать воспринимать ввод символьных инструкций и преобразовывать их в машинный код. Инициализируйте начальный адрес для инструкций в сегменте кода смещением 100Н с помощью команды

DEBUG выведет адрес сегмента кода и смещения (01 ООН) в виде хххх:0100. Введите следующие инструкции:

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

xxxx:0100 MOV CL,42

хххх:0102 MOV DL,2A

хххх:0104 ADD CL, DL

хххх:0106 JMP 100

Перед выполнением программы воспользуйтесь командой U (Unassemble – дизассемблировать) для просмотра созданного DEBUG машинного кода.

Команда U выводит на дисплей машинный код, соответствующий введенным символьным инструкциям. Можно использовать эту команду для указания первой и последней инструкций, которые нужно просмотреть, т. е. в данном случае это 0100Н и 0107Н. Введите команду

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

xxxx:0100 B142 MOV CL,42

хххх:0102 В22А MDV DL,2A

хххх:0104 00D1 ADD CL, DL

хххх:0106 EBF8 JMP 100

Теперь отследите выполнение машинного кода введенной программы. Начните с ввода команды R для просмотра содержимого регистров (IР должен содержать значение 0100Н) и следующей выполняемой инструкции (MOV CL,42). Затем последовательно вводите команды Т для выполнения инструкций. Когда дойдете до JMP 100, IР должен содержать 0106Н, a CL – 6СН.

2.2.19. Использование инструкции INT


Следующие четыре примера показывают, как запрашивать информацию о системе. Для этого можно использовать инструкцию INT (interrupt – прерывание), которая осуществляет выход из программы, вызов подпрограммы DOS или BIOS, выполнение заданной функции и возвращение в программу. Есть разные типы операций INT, некоторые из них требуют наличия кода функции (function code) в регистре АН для выполнения определенного действия. Вместо использования команды Т для пошагового исполнения программ, используется команда Р (Proceed – продолжить) для выполнения всей программы обработки прерывания сразу. Убедитесь, что IP установлен в 0100Н.

2.2.20. Получение текущих значений даты и времени

Инструкция для получения текущих значений даты и времени – INT 21H, с кодом функции 2АН. Снова введите в DEBUG команду А 100, а затем — следующие инструкции:

Введите R для просмотра регистров и Т для выполнения инструкции MOV. После этого введите Р для выполнения подпрограммы обработчика прерываний; выполнение остановится на инструкции JMP. Регистры будут содержать в шестнадцатеричной форме следующую информацию:

AL: день недели, где 0 = воскресенье

СХ: год (например, 07D7H = 2007)

DH: месяц (от 01Н до 0СН)

DL: день месяца (от 01H до 1FH)

Операция для получения текущего времени – INT 21H с кодом функции 2СН. Сначала используйте команду R IP для установки IP в 0100Н, а затем введите следующие команды:

Выполните программу так же, как и предыдущую. Операция помещает число часов в СН (в 24-часовом формате, где 00 – полночь), минуты – в CL, секунды – в DH и сотые доли секунды – в DL.

2.2.21. Определение установленного оборудования

В одном из упражнений в начале работы просматривалось содержимое байтов с адресами 410Н и 411H, для определения оборудования, присутствующего в системе. BIOS содержит прерывание, INT 11H, помещающего соответствующую информацию в АХ. Введите команду А 100 в DEBUG и следующие инструкции:

Введите R для просмотра регистров и первой инструкции. Эта инструкция, INT 11H, передает управление подпрограмме BIOS, помещающей данные об установленном оборудовании в АХ. Используйте команды Т для наблюдения за последовательным выполнением инструкций BIOS.

Инструкции, содержащиеся в BIOS вашего компьютера, могут отличаться от приведенных ниже – в зависимости от установленной марки и версии BIOS.

PUSH DS ; Сохранить адрес из DS в стеке

M0V АХ,0040 ; Получить адрес сегмента,

MOV DS, АХ ; поместить его в DS

MOV АХ,[0010] ; Поместить данные из 40:10 в АХ

POP DS ; Восстановить адрес в DS из стека

IRET ; Вернуться в исходную программу

Последняя команда Т производит выход из BIOS и возвращает управление DEBUG. Если все выполнено правильно, АХ теперь содержит данные об установленном оборудовании. Введите Q для выхода или переходите к следующему примеру (установив IР в 0100Н).

2.2.22. Использование INT для вывода на дисплей

Этот пример, выводящий данные на экран, вводит в употребление несколько новых возможностей. Введите в DEBUG команду А 100, а затем – следующие инструкции:

109 DB ‘your name’, ‘$’

Две инструкции MOV указывают INT 21H организовать вывод на экран (АН = 09Н) и с какого начального адреса (DX = 109). По смещению 109Н начинается строка, где DB означает «define byte» – «определить байт». Символы, подлежащие выводу, заключены в апострофы (‘). За строкой, которую необходимо вывести, следует знак доллара ($), также заключенный в апострофы, указывающий INT на конец вывода.

Введите R для выполнения просмотра регистров и первой инструкции, две команды Т – для выполнения двух инструкций MOV, и Р – для выполнения INT 21Н, и на экране увидите строку, заключенную в апострофы. Введите Q для выхода или переходите к следующему примеру (установив IP в 0100Н).

2.2.23. Использование INT для ввода с клавиатуры

Этот пример, воспринимающий символы с клавиатуры, также демонстрирует новые возможности. Введите команду DEBUG A 100 и следующие инструкции на Ассемблере:

Первая инструкция, MOV, указывает код функции, 10Н, задающий использование INT 16H для ввода с клавиатуры. При выполнении инструкций обработчиком с клавиатуры считывается символ и помещается в регистр AL. Введите для просмотра регистров и следующей инструкции, и Т – для выполнения инструкции MOV. Затем введите Р для выполнения INT 16H, после чего система будет ожидать нажатия клавиши. Если вы нажмете клавишу 1, вы увидите, что в AL помещено число З1H(это ASCII-код цифры 1). Введите Т для выполнения инструкции JMP 100, затем еще раз Т – для выполнения MOV АН,10. Когда вы введете Р для выполнения INT 16H, система вновь будет ожидать нажатия клавиши. Если вы нажмете 2, то увидите, что в AL занесено значение 32Н. Можно продолжать ввод до бесконечности, следуя только что описанной процедуре. Введите Q для выхода или переходите к следующему примеру (установив IP в 0100Н).

2.2.24. Использование оператора PTR

В предыдущих примерах, помещавших данные в регистр, DEBUG мог определить, исходя из типа регистра (AL или АХ, например), сколько байтов необходимо переместить. Приведенная ниже программа помещает непосредственные данные в память. Поскольку инструкция вроде MOV [120],25 не указывает количества байт, для этой цели можно использовать оператор PTR. Вот инструкции программы:

10D MOV WORD PTR [120],25

113 MOV BYTE PTR [122],30

Ниже приведено описание инструкций.

100: Поместить содержимое ячеек памяти 11АН и 11ВН в АХ. Квадратные скобки указывают на то, что операнд — адрес в памяти, а не непосредственное значение.

103: Добавить содержимое ячеек памяти 11СН и 11ВН к АХ.

107:Добавить непосредственное значение 25Н к АХ.

10А: Поместить содержимое регистра АХ в ячейки памяти с адресами 11EH и11FH.

10D: Поместить непосредственное значение 25Н в ячейки памяти 120Н и 121Н. Оператор WORD PTR, указывает DEBUG, что значение 25Н должно быть помещено в слово в памяти. Если записать данную инструкцию в виде MOV [120],25, DEBUG не смогла бы определить, какая длина выделенного участка памяти подразумевалась, и вывела бы сообщение об ошибке.

113: Поместить непосредственное значение 30Н в ячейку памяти по адресу 122Н. На этот раз используется оператор BYTE PTR для указания длины в 1 байт.

11А: Определить значения байт 14Н и 23Н. DB определяет байты для элементов данных, на которые инструкции (например, первая) ссылаются.

11С, 11Е, и 120: Определить другие значения, используемые в программе.

Для ввода этой программы сначала введите команду DEBUG A 100, а затем последовательно введите все инструкции (но не адреса, с которых начинаются строки). В конце еще раз нажмите клавишу для завершения ввода. Для выполнения программы сначала воспользуйтесь командой R для просмотра состояния регистров и первой инструкции, а затем используйте последовательность команд Т. Остановите выполнение, когда дойдете до команды JMP 100 по адресу 118Н. Командой D просмотрите содержимое области памяти программы и убедитесь, что изменилось содержимое АХ (23ЗН) и ячеек памяти с адресами 11EH-11FH (ЗЕ23), 120Н-121Н (2500) и 122Н (30). Введите Т для повторения программы или Q – для выхода.

indbooks

Читать онлайн книгу

12.8. Сервисы и прерывания BIOS

Системная BIOS предоставляет ряд сервисов низкого уровня, в основном предназначенных для обслуживания ввода-вывода и имеющих отношения к стандартным аппаратным интерфейсам. Традиционные сервисы BIOS обычно вызываются в реальном режиме или V86 посредством инструкций программных прерываний ( Int xx ). Большинство сервисов может быть вызвано и через фактически стандартизованные точки входа (адреса в области ROM BIOS) дальними вызовами процедур ( CALL Far ) с предварительным помещением в стек регистра флагов (сервисы построены как обработчики прерываний). Все традиционные сервисы BIOS работают в 16-разрядном режиме процессора, и ими можно пользоваться в реальном режиме, V86 и малопривлекательном 16-разрядном защищенном режиме.

Для процессоров 386+ оптимальным по эффективности является 32-разрядный защищенный режим. Для того чтобы из этого режима можно было пользоваться сервисами BIOS (правда, не всеми) без промежуточных переключений, по инициативе фирмы Phoenix ввели 32-разрядные вызовы BIOS32. Адрес точки входа BIOS32 заранее не известен, но известен способ его нахождения: в диапазоне адресов памяти 0E0000-0FFFFFh на границе параграфов (младшие 4 бита адреса нулевые) ищется строка-сигнатура « _32_ » (число 325F5F33h) заголовка, за которой следует физический адрес точки входа. Сами сервисы вызываются дальними вызовами точки входа в сервис. Номер, параметры вызываемых функций и результаты передаются на регистрах процессора.

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

♦ Int 00h — деление на 0;

♦ Int 01h — пошаговый режим;

♦ Int 03h — точка останова;

♦ Int 04h — переполнение;

♦ Int 06h — недопустимая команда 286+;

♦ Int 07h — вызов отсутствующего NPU.

♦ Int 02h — немаскируемое прерывание;

♦ Int 08h — таймер 8253/8254;

♦ Int 09h — клавиатура;

♦ Int 0Ah — IRQ2/9 ;

♦ Int 0Bh — IRQ3 ;

♦ Int 0Ch — IRQ4 ;

♦ Int 0Dh — IRQ5 ;

♦ Int 0Eh — IRQ6 — контроллер гибких дисков;

♦ Int 0Fh — IRQ7 ;

♦ Int 70h — CMOS-таймер;

♦ Int 71h — IRQ9 (перенаправлено на Int 0Ah );

♦ Int 72h — IRQ10 ;

♦ Int 73h — IRQ11 ;

♦ Int 74h — IRQ12 (контроллер мыши PS/2);

♦ Int 75h — IRQ13 — исключение сопроцессора;

♦ Int 76h — IRQ14 — контроллер жестких дисков;

♦ Int 77h — IRQ15 .

ПРИМЕЧАНИЕ

Прерывания Int 70h — 77h имеют место только в AT.

Функции ROM BIOS (16-битные сервисы):

♦ Int 05h (F000:FF54h) — печать экрана;

♦ Int 10h — видеосервис;

♦ Int 11h — чтение списка оборудования (слово из BDA 0040:0010h), возвращает в АХ :

• биты 15:14 — число обнаруженных LPT-портов: 00 — 0, …, 11 — 3;

• бит 12 — обнаружен игровой адаптер;

• биты 11:9 — число обнаруженных СОМ-портов: 000 — 0, …, 111 — 7;

• бит 8 — наличие контроллера DMA;

• биты 7:6 — число обнаруженных НГМД: 00 — 1, …, 11 — 4;

• биты 5:4 — активный видеорежим: 00 — резерв, 10 — 80-колоночный цветной, 01 — 40-колоночный цветной, 11 — монохромный;

• биты 3:2 — размер ОЗУ на системной плате (теперь обычно 00);

• бит 1 — присутствие математического сопроцессора;

• бит 0 — присутствие дисководов;

♦ Int 12h — размер непрерывной памяти;

♦ Int 13h — дисковый сервис (блочный ввод-вывод);

♦ Int 14h — обслуживание СОМ-портов;

♦ Int 15h — AT-функции (системный сервис, функции определяются значением АН / АХ ):

• 00-03h — управление и обмен данными с кассетным магнитофоном (были когда-то и такие «стриммеры»!) на старых PC;

• 4fh — перехват клавиатуры;

• 53xxh — сервисы управления потреблением АРМ (Advanced Power Management);

• 8300h — запуск таймера, устанавливающего флаг в заданной ячейке;

• 8301h — сброс того же таймера;

• 84h — джойстик (см. п. 8.6);

• 86h — программируемая задержка;

• 87h — перемещение блока расширенной памяти;

• 88h — получение размера расширенной памяти;

• 89h — переключение в режим V86;

• C0h — получение системной конфигурации, при успешном выполнении ( CF =0, AH =0) ES:BX указывает на таблицу данных конфигурации;

• 80-82h, 85h, 90h, 91h — функции многозадачных ОС (BIOS устанавливает заглушки);

♦ Int 16h — клавиатурный ввод-вывод;

♦ Int 17h — обслуживание LPT-портов;

♦ Int 18h — процедура восстановления при неудаче начальной загрузки (прежде — ROM-Basic);

♦ Int 19h — начальная загрузка (вызов процедуры Bootstrap);

♦ Int 1Ah — системное время, дата, будильник и 16-битные вызовы сервисов PCI;

♦ Int 1Bh — обработчик нажатия клавиш Ctrl+Break ;

♦ Int 1Ch — User Timer Interrupt, процедура, вызываемая обработчиком Int 08h каждые 55 мс; BIOS устанавливает простую заглушку ( IRET ), но программы могут перехватывать это прерывание; на время отработки этой процедуры все аппаратные прерывания запрещены (кроме NMI).

♦ Int 33h — поддержка мыши;

♦ Int 4Ah — обработчик будильника пользователя, установленного функцией BIOS Int 1Ah (6); прерывание вызывается асинхронно, так что при возврате из процедуры все регистры и флаги должны быть в том же состоянии, что и при входе; BIOS ставит заглушку ( IRET );

♦ Int 67h — EMS-функции.

Указатели на таблицы :

♦ Int 1Dh — видеопараметры;

♦ Int 1Eh — параметры дискет;

♦ Int 1Fh — знакогенератор СGA;

♦ Int 41h — параметры HDD 0;

♦ Int 46h — параметры HDD 1;

♦ Int 43h — знакогенератор EGA.

12.8.1. Int 09h, Int 16h — поддержка клавиатуры

Поддержка клавиатуры заключается в обработке прерываний от устройства ввода и предоставлении сервисов ввода прикладным программам.

Прерывания , вызванные приходом кодов нажатия и отпускания клавиш , обрабатывает BIOS Int 9h . Каждый принятый скан-код (или цепочка) обрабатывается с учетом состояния клавиатурных флагов . Результат обработки (как правило, ASCII-символ в младшем байте и скан-код в старшем) помещается в клавиатурный буфер , расположенный в ОЗУ. По приему каждого символа указатель головы буфера увеличивается. Буфер организован в виде кольца, после достижения конца области буфера указатель головы установится на начало области. В случае переполнения буфера (указатель головы «догнал» указатель хвоста) очередное слово не записывается, и подается звуковой сигнал. Размер позволяет хранить описание шестнадцати фактов нажатий клавиш. Нажатие клавиш Ctrl , Shift , Alt и некоторых комбинаций в буфере не отмечается, но приводит к модификации бит ячеек флагов клавиатуры. Нажатие «системной» комбинации Ctrl+Alt+Del , клавиши PrintScreen ( SysRq ) и некоторых других к записи в клавиатурный буфер не приводит, а вызывает специальные процедуры.

Для обслуживания клавиатуры используются ячейки ОЗУ из области данных BIOS (BIOS Data Area):

♦ 0:0417, 0:418 — флаги клавиатуры;

♦ 0:0419 — аккумулятор кода Alt -набора;

♦ 0:041А — указатель головы буфера (Buffer Head), 2 байта (модифицируется при помещении символа в буфер);

♦ 0:041C — указатель хвоста буфера (Buffer Tail), 2 байта (модифицируется при извлечении символа из буфера);

♦ 0:041E-0:042D — область кольцевого буфера (16 слов).

Обработчик аппаратного прерывания до обработки принятого скан-кода вызывает прерывание BIOS Int 15h с AH =4Fh, а в AL находится принятый скан-код. Стандартный обработчик Int 15h (4Fh) просто выполняет возврат с CF =0, но его можно заменить специальным обработчиком, который будет при необходимости подменять принятые скан-коды на какие-либо иные (оставляя их в AL ), что должно отмечаться установкой CF =1. В старых версиях BIOS такой возможности перехвата не было, ее наличие можно определить вызовом Int 15h (C0h).

Для клавиатуры USB или иного устройства ввода, заменяющего клавиатуру в качестве консоли, прерывание Int 9h должно вызываться программно при обработке каждого клавиатурного события. Обработчик этого прерывания должен выполнять те же действия: скан-код пропускать через Int 15h (4Fh) и помещать в клавиатурный буфер, а также модифицировать флаги клавиатуры.

Интерфейс прикладного уровня для клавиатуры представляет BIOS Int 16h . Его основное назначение — извлечение слов из клавиатурного буфера. Функция задается в регистре АН при вызове, результат помещается в регистр АХ .

♦ АН = 00h — чтение (с ожиданием готовности) и выборка слова из буфера (меняется указатель хвоста). Индикаторы клавиатуры обновляются в соответствии с состоянием флагов. Если буфер пуст, то на AT выполняется прерывание Int 15h (подфункция 90), что может использоваться ОС, например, для переключения задач. Чтобы программа не «зависала» на ожидании символа, предварительно стоит проверить готовность функцией 01h. Символы расширенной клавиатуры фильтруются — преобразуются в их аналоги 83-клавишной клавиатуры.

♦ АН = 01h — проверка готовности, чтение без выборки (указатели не изменяются). Признак наличия символа в буфере — установленный флаг ZF .

♦ АН = 02h — чтение состояния флагов (в AL — байт 0:417h, см. выше).

♦ АН = 03h — установка задержки и частоты автоповтора: BL — код задержки (00=250, 01=500, 02=750, 03=1000 мс), ВН — код частоты (см. п. 9.2.1).

♦ АН = 05h — запись слова из регистра СХ в буфер (меняется указатель головы). Признак успешной записи — AL =0, если в буфере нет места, то AL =1.

♦ АН = 10h и AH = 11h — функции, аналогичные 00h и 01h, но предназначены специально для 101/102-клавишных клавиатур — в них не выполняется фильтрация символов расширенной клавиатуры. Для ряда клавиш, отсутствующих в клавиатуре АТ-84, эти функции дадут результаты, отличающиеся от вызовов 00h и 01h.

♦ AH =12h — чтение расширенного состояния флагов (в АХ — слово KbdShiftFlags101Rec ), в котором младший байт совпадает с тем, что дает функция 02h (слово из 0:417h), а старший байт похож на слово из 0:418h. Назначение бит АХ :

• бит 0 — клавиша Shift (правая) нажата;

• бит 1 — клавиша Shift (левая) нажата;

• бит 2 — клавиша Ctrl (любая) нажата;

• бит 3 — клавиша Alt (любая) нажата;

• бит 4 — включен индикатор Scroll Lock ;

• бит 5 — включен индикатор Num Lock ;

• бит 6 — включен индикатор Caps Lock ;

• бит 7 — включен режим Insert ;

• бит 8 — клавиша Ctrl (левая) нажата;

• бит 9 — клавиша Alt (левая) нажата;

• бит 10 — клавиша Ctrl (правая) нажата;

• бит 11 — клавиша Alt (правая) нажата;

• бит 12 — клавиша Scroll Lock нажата;

• бит 13 — клавиша Num Lock нажата;

• бит 14 — клавиша Caps Lock нажата;

• бит 15 — клавиша SysReq нажата.

Функции чтения буфера (00 и 10h) в регистре AL возвращают ASCII-код символа, в АН — скан-код . Символы, полученные нестандартным способом (в русском регистре или Alt -набором), сопровождаются нулевым скан-кодом. Alt -набор позволяет ввести в буфер любой символ — для этого его код в десятичной системе набирается на цифровой клавиатуре при нажатой клавише Alt , результат заносится в буфер при отпускании клавиши Alt .

При AL =0 регистр АН содержит расширенный ASCII-код (Extended ASCII Keystroke). Дополнительные клавиши 101/102 клавиатур при использовании функций 10h-12h генерируют код E0h в младшем байте и скан-код, соответствующий аналогичным управляющим клавишам 83/84-клавишных клавиатур.

Функция записи (05h), несколько неожиданная для клавиатуры, позволяет легко имитировать работу оператора для различных демонстрационных программ. Если прикладная программа не перехватывает обслуживание клавиатуры на уровне аппаратного прерывания ( Int 9h ), то резидентная программа может ей «подбрасывать» слова в буфер, которые будут восприниматься как нажатие клавиш.

ASCII-коды буфера, соответствующие нажатию клавиш, приведены в [1, 7]. При русификации (или другой локализации) клавиатуры отслеживание переключения регистров (языков) ложится на обработчик аппаратного прерывания клавиатуры.

12.8.2. Int 10h — видеосервис

Int 10h — видеосервис — предназначен для работы с графическим адаптером. Его первичной задачей является управление видеорежимом (BIOS Video Mode), определяющим формат экрана. BIOS адаптера должна выполнять программирование всех стандартных и специфических управляющих регистров для установки (смены) требуемого видеорежима и выбранных параметров развертки — кроме нее о способах этих переключений остальное ПО может и не знать.

В пределах возможностей установленного видеорежима видеосервис предоставляет возможности отображения информации на различных уровнях. Простейший для программиста телетайпный режим позволяет посылать поток символов, которые будут построчно отображаться на экране с отработкой символов возврата каретки, перевода строки, обеспечивая «прокрутку» изображения при заполнении экрана. Есть функции и для полноэкранной работы с текстом, при которой доступны и атрибуты символа. В графическом режиме имеется возможность чтения и записи пиксела с указанными координатами. Однако видеосервисом Int 10h программисты пользуются далеко не всегда, поскольку работает он довольно медленно. Подробно рассматривать функции видеосервиса не будем (этому посвящены отдельные книги), отметим особо лишь функцию телетайпного вывода Int 10h (0Eh). При вызове AH =0Eh, в AL — код выводимого символа, в BL — цвет (только для графического режима). Символ выводится в текущую позицию курсора, и курсор сдвигается на следующую, переходя на новую строку после конца предыдущей и прокручивая экран при его заполнении. Специальные символы вызывают возврат на начало строки ( CR , код 0Dh), перевод строки ( LF , 0Ah) и короткий гудок ( BEL , 07h). Этой функцией часто пользуются для вывода сообщений программами, работающими на нижнем уровне (например, модули инициализации ПЗУ расширений BIOS, загрузчики и другие, не имеющие еще доступа к сервисам операционных систем). Программа вывода получается простейшей, работает на всех адаптерах и во всех режимах, но довольно медленно.

12.8.3. Int 13h — поддержка дисков

Функции дискового сервиса вызываются программным прерыванием Int 13h .

Традиционно дисковый сервис подразделяет физические диски на дискеты (diskette) и фиксированные диски (fixed disk). Набор функций (табл. 7.8) для этих классов устройств несколько различается как по составу, так и по реализации. Классы различаются по диапазонам номеров физических устройств: для дискет отводятся номера 0-7Fh (реально только 0–3), а для фиксированных дисков — 80h-FFh.

Контроллеры дисковых интерфейсов, имеющие в своем составе дополнительные модули BIOS, перехватывают вектор Int 13h , беря на себя обслуживание своих устройств. Когда в IBM PC/XT появились жесткие диски со своим контроллером, модуль BIOS этого контроллера, инициализирующийся во время теста POST, вставал на место Int 13h , а указатель на исходный обработчик дискового сервиса (драйвер НГМД из системной BIOS) сохранялся на месте Int 40h . Хотя поддержка жестких дисков давно уже включена в системную BIOS, ради совместимости возможность использования прерывания Int 40h для вызова драйвера гибких дисков сохраняется. Интерфейс этого вызова совпадает с Int 13h , но номер устройства (в регистре DL ) не должен превышать 7Fh.

Кроме функций дискового сервиса ( Int 13h ) c дисковыми устройствами связаны еще и векторы, обслуживающие аппаратные прерывания от контроллера НГМД — Int 0Eh (линия IRQ 6 ) и от контроллера жестких дисков — Int 76h (линия IRQ 14 ). При наличии двухканального порта ATA второй канал обычно задействует линию IRQ 15 (вектор 77h). В XT контроллер жестких дисков занимал линию IRQ 5 (вектор 0Dh). Дополнительные контроллеры дисков могут использовать и другие прерывания. Аппаратные прерывания вырабатываются контроллерами по завершении (нормальному и аварийному) внутренних операций. На эти прерывания BIOS не реагирует, а при инициализации их векторы направляются на программную заглушку (инструкцию IRET ).

Стандартные драйверы дисковых функций BIOS (включая и расширенный сервис) имеют однозадачное происхождение. Во время выполнения функции значительное процессорное время может затрачиваться на ожидание завершения операции устройством. Драйверы многозадачного режима построены иначе: у них есть вызывающая часть, инициализирующая начало операции, и обработчик аппаратного прерывания от контроллера, сообщающий операционной системе о выполнении операции и результате.

Традиционный сервис BIOS

Традиционный дисковый сервис работает в 16-разрядном режиме процессора, все параметры вызова передаются через регистры процессора. Адрес сектора задается в системе CHS и размещен весьма специфично. Сервис вызывается программным прерыванием Int 13h , при вызове принимаются следующие соглашения:

♦ номер функции задается в регистре АН и не должен превышать 3Fh;

♦ логический номер диска задается в регистре DL (бит 7 = 0 — признак обращения к НГМД);

♦ номер цилиндра (0-1023) задается в регистре СН (младшие 8 бит) и CL[7:6] (старшие 2 бита);

♦ номер головки (0-255) задается в регистре DH ;

♦ номер начального сектора (1-63) задается в регистре CL[5:0] ;

♦ количество секторов , участвующих в операции, 8 бит — в регистре AL (0-255);

♦ указатель на начало буфера оперативной памяти для считываемых и записываемых данных (address of buffer) — в регистрах ЕS:BX ;

♦ результат выполнения операции определяется по флагу переноса: СF = 0 — успешное выполнение операции, CF = 1 — обнаружены ошибки (код состояния возвращается в регистре АН , код завершения последней операции с дискетами хранится по адресу 40:41h, с жесткими дисками — 40:74h);

♦ таблица параметров диска для дискет (DPT) задана указателем в памяти по адресу 0:78h, для жестких дисков (HDPT) — 0:104h или 0:118h.

Список функций традиционного сервиса приведен в табл. 12.7, подробнее они описаны в [4, 9]. Устройства могут не поддерживать некоторые функции, о чем драйверы должны «честно сообщить» кодом возврата 01h.

Таблица 12.7. Функции традиционного дискового сервиса

Номер функции АН Назначение параметров Использование регистров указателей и таблиц
DL DH, CL, CH AL ES: BX DPT/HDPT
00h Reset Disk System — сброс дисковой системы (всех контроллеров и устройств), позиционирование на нулевой цилиндр
01h Read Status of Last Operation — чтение состояния последней операции +
02h Read Sectors into Memory — чтение секторов с диска в память + + + + +
03h Write Sectors from Memory — запись секторов из памяти на диск + + + +
04h Verify Sectors — верификация секторов (холостое чтение без записи в память и проверка CRC/ECC) + + + +
05h Format Desired Track — форматирование трека + + + + +
08h Get Drive Parameters — получение параметров диска +Ві +Ві +Ві +Ві
09hВ№ Initialize Drive Parameters — инициализация таблиц параметров диска + +
0AhВ№ Read Long — «длинное» чтение (сектор и поле ЕСС) + + + + +
0BhВ№ Write Long — «длинная» запись (сектор и поле ЕСС) + + + + +
0ChВ№ Seek — поиск цилиндра + +
0DhВ№ Alternative Disk Reset — альтернативный сброс (не затрагивая контроллера дискет) +
10hВ№ Test Drive Ready — проверка готовности +
11hВ№ Recalibrate — рекалибровка (позиционирование на нулевой цилиндр) +
14hВ№ Controller Internal Diagnostics — диагностика контроллера жестких дисков
15h Read DASD Туре — получение типа диска: АН=0 — нет диска; АН=1 — дискета, без датчика смены диска; АН=2 — дискета, с датчиком смены диска; АН=3 — жесткий диск; иные значения — код ошибки. CX: DX содержат число 512-байтных секторов на диске +
16hВІ Diskette Change Line Status — проверка статуса смены дискеты: CF=0: АН=0 — смены носителя не было; CF=1: AH=1 — недопустимый номер диска; АН=6 — была смена диска или определение смены не поддерживается; AH=80h — дисковод не готов или не установлен; иные значения — код ошибки +
17hВІ Set Diskette Type for Format — установка типа дискеты для форматирования (перед форматированием) + +Ві
18hВІ Set Media Type for Format — установка типа носителя (для форматирования) + +Ві
20hВІ Get Media Type — получение типа установленного носителя +
24hВ№ Set Multiple Mode — установка параметров режима многосекторного обращения (в AL — число секторов за операцию) + +
25hВ№ Identify Drive ATA — идентификация накопителя (только для ATA-дисков) + +

В№ Только для фиксированных дисков.

ВІ Только для дискет и других сменных носителей.

Ві Назначение отличается от обычного.

Формально традиционный сервис позволяет работать с дисками, имеющими до 1024Г—256Г—63 = 16 515 072 секторов (около 8,4 Гбайт). Ряд операционных систем имеет ошибку, не позволяющую использовать полный объем, допустимый данным сервисом. Для дисков объемом более 15 481 935 секторов следует пользоваться только функциями расширенного сервиса (см. ниже). Однако при работе с устройствами ATA имеется еще и барьер в 528 Мбайт. Дело в том, что контроллер жесткого диска ATA, на который ориентированы драйверы Int 13h , имеет только 4-битный регистр номера головки (а в BIOS — 6 бит). Правда, этот же контроллер способен принимать 16-битный номер цилиндра (в BIOS — 10 бит). Понятно, что непосредственно без искажений через эти два фильтра (формат вызова и формат регистров контроллера) может пройти только вызов с самыми жесткими ограничениями по каждой координате. Тогда ограничение, полученное тем же перемножением диапазонов координат, получается около 528 миллионов байт:

(2 10 = 1024 цилиндра) Г— (2 4 = 16 головок) Г— (2 6 – 1 = 63 сектора) Г— 512 байт = 528 482 304 байт.

Для преодоления 528-мегабайтного барьера дисков ATA, не трогая программного интерфейса, в BIOS ввели расширение традиционного дискового сервиса. Интерфейс ATA в трехмерной геометрии позволяет реализовать довольно большой (но уже не запредельный) объем диска:

(2 16 = 65 536 цилиндров) Г— (2 4 = 16 головок) Г— (2 8 – 1 = 255 сектора) Г— 512 байт = 136,9 Гбайт.

Чтобы достичь хотя бы интерфейсного ограничения BIOS (8,4 Гбайт), стали применять трансляцию параметров вызова функций Int 13h , которые будем теперь называть логическими, в физические [6] параметры, передаваемые контроллерам ATA-дисков. В функции, которая сообщает параметры диска (функция 8), производится обратная трансляция, так что на стороне вызова программного интерфейса Int 13h присутствуют только логические параметры. Естественно, логический объем диска не может превышать физического: (С Г— H Г— S)ЛОà ≤ (С Г— H Г— S)ФИЗ.

Подробнее о преодолении барьеров и способах трансляции (LBA, Large Disk, ECHS) см. в [1, 4, 9]

Расширенный сервис BIOS

Чтобы получить возможность работы через BIOS с дисками объема более 8,4 Гбайт, потребовалось ввести новые функции дискового сервиса.

Расширенный дисковый сервис BIOS, Enhanced Disk Drive Services (EDD), продвигаемый фирмой Phoenix Technologies LTD, реализуется многими разработчиками BIOS и устройств массовой памяти. Он позволяет работать с устройствами, имеющими объем до 2 64 секторов, эффективно используя архитектуру процессоров IA-32 и IA-64. Сервис оперирует линейным логическим адресом сектора (LBA). Вместо традиционных таблиц параметров дисков в нем используются новые, дающие исчерпывающую информацию об устройствах, их физической организации и интерфейсе. Устройства могут иметь сменные носители и сами быть съемными в процессе работы компьютера (например, подключенные к шине USB или IEEE 1394), так что понятие «сменяемость носителя» несколько размывается. Такие устройства должны поддерживать механизм уведомления о смене носителя и программное блокирование смены носителя. По прогнозам емкости данного интерфейса должно хватить на 15–20 лет.

Расширения BIOS Int 13h используют ОС Windows 95, Windows 98, Windows 2000. Правда, это использование ограничено лишь начальной загрузкой и процессом установки (FDISK, FORMAT), поскольку в регулярной работе применяются собственные 32-разрядные драйверы. Расширения BIOS Int 13h не используют DOS (все версии), Windows 3.1x, Windows NT, Novell NetWare, OS/2 Warp, Linux, Unix.

В настоящее время определены три набора функций:

♦ доступ к фиксированным дискам (fixed disk access subset) — функции 41-44h, 47h и 48h;

♦ блокировка и смена носителя (device locking and ejecting subset) — функции 41h, 45h, 46h, 48h и 49h;

♦ поддержка расширенных дисков (enhanced disk drive (EDD) support subset) — функции 41h и 48h.

Расширенный сервис, как и традиционный, вызывается программным прерыванием Int 13h с номерами функций свыше 3Fh (регистр АН ); номер устройства (регистр DL ) допустим в диапазоне 80h-FFh. Основные параметры вызова — начальный адрес блока, число секторов для передачи и адрес буфера — передаются через адресный пакет (device address packet). Формат пакета в сравнении с передачей параметров традиционного сервиса через регистры процессора довольно просторный.

Поскольку расширение BIOS может и отсутствовать, имеется функция проверки его наличия (номер 41h). Расширение может действовать избирательно (не для всех устройств), так что проверку надо производить для конкретного устройства, интересующего программу. Проверка дает номер версии расширения и карту поддерживаемых наборов функций. Функции расширенного чтения, записи, верификации и поиска (42h, 43h, 44h и 47h) по смыслу не отличаются от их аналогов из традиционного сервиса. Для работы со сменными носителями введены функции отпирания/запирания, извлечения и проверки факта смены носителя (45h, 46h и 49h). От идеологии традиционного сервиса сильно отличается функция получения параметров устройства (48h). Она возвращает в ОЗУ буфер с набором параметров и детальным описанием устройства, позволяющим ОС и приложениям работать с ним, минуя BIOS. Функция установка аппаратной конфигурации (4Eh) позволяет управлять режимом передачи (PIO, DMA), а также предварительной выборкой (поиском).

Для эмуляции дисков на загружаемых CD-ROM к сервисам BIOS Int 13h добавляется несколько новых функций:

♦ начать/завершить эмуляцию диска (4Ah/4Bh), начать эмуляцию диска и выполнить загрузку (4Ch);

♦ прочитать секторы загрузочного каталога (4Dh); функции 41-48h позволяют обращаться к любым логическим секторам CD-ROM (в режиме LBA с размером сектора 2048 байт), когда для данного привода включена эмуляция.

Подробнее расширенный сервис рассмотрен в [4].

12.8.4. Int 14h — поддержка СОМ-портов

СОМ-порты поддерживаются сервисом BIOS Int 14h , который обеспечивает описанные ниже функции.

♦ 00h — инициализация (установка скорости обмена и формата посылок, заданных регистром AL ; запрет источников прерываний). На сигналы DTR и RTS влияния не оказывает (после аппаратного сброса они пассивны).

♦ 01h — вывод символа из регистра AL (без аппаратных прерываний). Активируются сигналы DTR и RTS , и после освобождения регистра THR в него помещается выводимый символ. Если за заданное время регистр не освобождается, фиксируется ошибка тайм-аута и функция завершается.

♦ 02h — ввод символа (без аппаратных прерываний). Активируется только сигнал DTR ( RTS переходит в пассивное состояние), и ожидается готовность принятых данных, принятый символ помещается в регистр AL . Если за заданное время данные не получены, функция завершается с ошибкой тайм-аута.


♦ 03h — опрос состояния модема и линии (чтение регистров МSR и LSR ). Эту гарантированно быструю функцию обычно вызывают перед функциями ввода-вывода во избежание риска ожидания тайм-аута.

При вызове Int 14h номер функции задается в регистре АН , номер порта (0–3) — в регистре DX (0 — COM1 , 1 — COM2 …). При возврате из функций 0, 1 и 3 регистр АН содержит байт состояния линии (регистр LSR), AL — байт состояния модема (MSR). При возврате из функции 2 нулевое значение бита 7 регистра АН указывает на наличие принятого символа в регистре AL ; ненулевое значение бита 7 — на ошибку приема, которую можно уточнить функцией 3.

Байт состояния линии (регистр АН ) имеет следующий формат:

♦ бит 7 — ошибка тайм-аута (после вызова функции 2 — признак любой ошибки);

♦ бит 6 — регистр сдвига передатчика пуст (пауза передачи);

♦ бит 5 — промежуточный регистр передатчика пуст (готов принять символ для передачи);

♦ бит 4 — обнаружен обрыв линии;

♦ бит 3 — ошибка кадра (отсутствие стоп-бита);

♦ бит 2 — ошибка паритета принятого символа;

♦ бит 1 — переполнение (потеря символа);

♦ бит 0 — регистр данных содержит принятый символ.

Байт состояния модема (регистр AL при возврате из функций 0, 1, 3) имеет следующий формат:

♦ бит 7 — состояние линии DCD ;

♦ бит 6 — состояние линии RI ;

♦ бит 5 — состояние линии DSR ;

♦ бит 4 — состояние линии CTS ;

♦ бит 3 — изменение состояния DCD ;

♦ бит 2 — изменение огибающей RI ;

♦ бит 1 — изменение состояния DSR ;

♦ бит 0 — изменение состояния CTS .

При инициализации порта биты регистра AL имеют следующее назначение:

♦ биты [7:5] — скорость обмена:

• 000=110; 100=1200; 001=150; 101=2400;

• 010=300; 110=4800; 011=600; 111=9600 бит/с;

♦ биты [4:3] — контроль паритета:

• 01 — число единиц нечетное;

• 0 и 10 — без контроля;

♦ бит 2 — количество стоп-бит: 0–1 бит, 1–2 бита (на скорости 110 бит/с — 1,5 стоп-бит);

♦ биты [1:0] — длина посылки: 00 — 5 бит, 01 — 6 бит, 10 — 7 бит, 11 — 8 бит.

В процессе начального тестирования POST BIOS проверяет наличие последовательных портов (регистров UART 8250 или совместимых) по стандартным адресам и помещает базовые адреса обнаруженных портов в ячейки BIOS Data Area 0:0400, 0402, 0404, 0406. Эти ячейки хранят адреса портов с логическими именами COM1 — СОМ4 . Нулевое значение адреса является признаком отсутствия порта с данным номером. В ячейки 0:047С, 047D, 047Е, 047F заносятся константы, задающие тайм-аут для портов.

Обнаруженные порты инициализируются на скорость обмена 2400 бит/с, 7 бит данных с контролем на четность (even), 1 стоп-бит. Управляющие сигналы интерфейса DTR и RTS переводятся в исходное состояние («выключено» — положительное напряжение).

12.8.5. Int 17h — поддержка принтера

Сервисы BIOS Int 17h : обеспечивают инициализацию, вывод байта данных и опрос состояния принтера, подключенного к LPT-порту. При вызове функция задается в регистре АН , номер LPT-порта — в регистре DX.

♦ АН = 00h — вывод байта из регистра AL по протоколу Centronics (без аппаратных прерываний). Данные помещаются в выходной регистр, и, дождавшись готовности принтера (снятия сигнала Busy ), формируется строб.

♦ АН = 01h — инициализация интерфейса и принтера (установка исходных уровней управляющих сигналов, формирование импульса Init# , запрет аппаратных прерываний и переключение на вывод двунаправленного интерфейса).

♦ АН = 02h — опрос состояния принтера (чтение регистра состояния порта).

При возврате регистр АН содержит байт состояния , который собирается из бит регистра состояния SR[7:3] и программно формируемого флага тайм-аута. Биты 6 и 3 относительно байта, считанного из регистра состояния, инвертированы. Назначение бит байта состояния:

♦ бит 7 — не занято (сигнал Busy ); нулевое значение означает, что принтер занят (буфер полон или состояние Off-Line, или ошибка);

♦ бит 6 — подтверждение (сигнал Ack# ); единичное значение означает, что принтер подключен;

♦ бит 5 — конец бумаги (сигнал PaperEnd );

♦ бит 4 — принтер готов (сигнал Select ); нулевое значение означает, что принтер в состоянии Off-Line;

♦ бит 3 — ошибка принтера (сигнал Error# ); единичное значение соответствует ошибке;

♦ биты 2:1=00 (не используются);

♦ бит 0 — флаг тайм-аута, устанавливается при неудачной попытке вывода символа, если сигнал Busy не снимается в течение времени, определенного для данного порта в ячейках тайм-аута (в BIOS Data Area); в этом случае согласно протоколу Centronics строб данных не вырабатывается.

Перехват прерывания Int 17h является удобным способом внедрения собственных драйверов принтера. Потребность в них может возникать при подключении к порту принтера с интерфейсом ИРПР или необходимости перекодировки символов. Если разрабатываемый драйвер предназначен не только для перекодировки, но и изменения протокола (через Int 17h можно организовать вывод через LPT-порт по протоколу ИРПР и даже через СОМ-порт), следует внимательно отнестись к битам возвращаемого байта состояния. При их неправильном формировании попытки вывода на печать могут приводить к ошибочным сообщениям.

12.8.6. Int 1Ah и Int 15h — поддержка таймеров

Сервисы BIOS Int 1Ah позволяют считывать и модифицировать значения системного таймера, даты и времени , а также установки будильника часов реального времени CMOS RTC. Перечисленные ниже номера функций указываются при вызове в регистре АН .

1. АН =0 — чтение системного таймера (двойного слова по адресу 40:006Eh в BIOS Data Area, инкрементируемого по прерываниям от канала 0 счетчика- таймера 8253/8254 примерно раз в 55 мс. Таймер обнуляется при выполнении теста POST после аппаратного сброса). Возвращает значение таймера, в СХ — старшую часть, в DX — младшую. AL =0, если за последние 24 часа не было переполнения таймера. В современных версиях сброс AL возвращает счетчик переполнений таймера, хранящийся в ячейке 40:0070h (в старых версиях это был флаг).

2. АН =1 — установка системного таймера ( СХ — старшая часть, в DX — младшая) и сброс флага (счетчика) переполнения таймера в ячейке 40:0070h. В случае ошибки устанавливается флаг CF =1.

3. АН =2 — чтение времени из RTC. Возвращает в упакованном BCD-формате час (в регистре СН ), минуту ( CL ), секунду ( DH ) и признак коррекции летнего/зимнего времени ( DL =1 — коррекция используется, DL =0 — нет). Признаком успешной операции является флаг CF =0. Во избежание ошибок некоторых BIOS при вызове флаг CF должен быть сброшен.

4. АН =3 — установка времени в RTC, назначение регистров и признак результата аналогичен функции 2.

5. АН =4 — чтение даты из RTC. Возвращает в упакованном BCD-формате век (в регистре СН ), две старшие цифры года ( CL ), месяц ( DH ) и день ( DL ). Признаком успешной операции является флаг CF =0. Во избежание ошибок некоторых BIOS при вызове флаг CF должен быть сброшен.

6. АН =5 — установка даты в RTC, назначение регистров и признак результата аналогичен функции 4.

7. АН =6 — установка времени срабатывания будильника RTC. Возвращает в упакованном BCD-формате час (в регистре СН ), минуту ( CL ) и секунду ( DH ). Если будильник уже установлен, переустановка не производится и возвращается флаг CF =1. При срабатывании будильник вызывает прерывание Int 4Ah .

8. АН =7 — отмена установки будильника.

Функции BIOS Int 15h позволяют программировать таймер CMOS RTC — вводить задержку или запускать таймер установки флага, указывая время в микросекундах (СХ — старшее слово, DX — младшее). Нулевое значение интервала не вызывает никаких действий. Достижимое разрешение в зависимости от производительности ПК может достигать единиц миллисекунд, максимальная выдержка — около 70 часов. Перечисленные ниже номера функций указываются при вызове в регистре АН или АХ .

9. AH =86h — задержка на заданное время. Управление будет возвращено вызвавшему процессу только через указанный интервал. По окончании задержки будет установлен бит 7 в ячейке BDA 0040:00A0. Таймер может оказаться занятым, тогда вызов сразу возвратит флаг CF =1 (при успехе CF =0, а в AL окажется маска, записанная в 8259А#2).

10. AX =8300h — запуск таймера, устанавливающего флаг после указанной задержке бит 7 в ячейке, заданной регистрами ES : BX . При успешном запуске CF =0; если таймер занят (он один) — CF =1 и AL =0. Управление возвращается процессу сразу, а флаг будет установлен через заданное время. Перед завершением программа, запускавшая таймер, должна его сбросить функцией 8301h (во-первых, чтобы освободить; во-вторых, чтобы снять «адскую машинку», которая неожиданно сама может изменить значение ячейки памяти, вполне возможно уже задействованную другим, ничего не «подозревающим» процессом).

11. AX =8301h — сброс того же таймера.

12.8.7. PCI BIOS

Функции PCI BIOS используются только для поиска и конфигурирования устройств PCI — процедур, требующих доступа к их конфигурационному пространству (см. п. 8.2). Регулярная работа с этими устройствами выполняется через обращения к регистрам устройств по адресам, полученным при конфигурировании, и обработке известных номеров прерываний от этих устройств. Для 16-битного интерфейса реального режима , V86 и 16-битного реального режима, функции PCI BIOS вызываются через прерывание Int 1Ah ; номер функции задается при вызове в регистре АХ . Возможна и программная имитация прерывания дальним вызовом по физическому адресу 000FFE6EH (стандартная точка входа в обработчик Int 1Ah ) с предварительным занесением в стек регистра флагов.

Признаком нормального выполнения является CF =0 и АН =0; при CF =1 АН содержит код ошибки :

♦ 81h — неподдерживаемая функция;

♦ 83h — неправильный идентификатор производителя;

♦ 86h — устройство не найдено;

♦ 87h — неправильный номер регистра PCI.

Вызовы требуют глубокого стека (до 1024 байт). Для 32-разрядных вызовов защищенного режима все эти же функции вызываются через точку входа, найденную через каталог 32-разрядных сервисов (см. выше), при этом назначение входных и выходных регистров и флага CF сохраняется. До использования 32-разрядного интерфейса следует сначала найти его каталог и убедиться в наличии сервисов PCI. Функции PCI BIOS перечислены ниже:

♦ АХ = B101h — проверка присутствия PCI BIOS . При наличии PCI BIOS возвращает CF =0, АН =0 и EDX =20494350h (строка символов «PCI «); проверяться должны все три признака. При этом в AL находится описатель аппаратного механизма доступа к конфигурационному пространству и генерации специальных циклов PCI:

• Бит 0 — поддержка механизма № 1 для доступа к конфигурационному пространству;

• Бит 1 — поддержка механизма № 2 для доступа к конфигурационному пространству;

• Биты 2:3=00 (резерв);

• Бит 4 — поддержка генерации специального цикла по механизму № 1;

• Бит 5 — поддержка генерации специального цикла по механизму № 2;

• Биты 6:7=00 (резерв).

В регистрах ВН и BL возвращается старший и младший номер версии (BCD-цифры), в CL — максимальный номер шины PCI, присутствующий в системе (число шин +1, поскольку они нумеруются с нуля последовательно). В регистре EDI может возвращаться линейный адрес точки входа 32-разрядных сервисов BIOS. Этот адрес возвращается не всеми версиями BIOS (некоторые не изменяют EDI ); для проверки можно при вызове обнулять EDI и проверять на нуль возвращенное значение.

♦ АХ = B102h — поиск устройства по идентификатору . При вызове в СХ указывается идентификатор устройства, в DX — идентификатор производителя, в SI — индекс (порядковый номер) устройства. При успешном возврате в ВН — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции. Для нахождения всех устройств с указанными идентификаторами вызовы выполняют, последовательно инкрементируя SI от 0 до получения кода возврата 86h.

♦ AX = B103h — поиск устройства по коду класса . При вызове в ЕСХ[23:16] указывается код класса, в ЕСХ[15:8] — подкласса, в ЕСХ[7:0] — интерфейс, в SI — индекс устройства (аналогично предыдущему). При успешном возврате в ВН — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции.

♦ АХ = B106h — генерация специального цикла PCI . При вызове в BL указывается номер шины, в EDX — данные специального цикла.

♦ АХ = В108h — чтение байта конфигурационного пространства устройства PCI . При вызове в ВН — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции, в DI — номер регистра (0-FFh). При успешном возврате в CL — считанный байт.

♦ АХ = B109h — чтение слова конфигурационного пространства устройства PCI . При вызове в ВН — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции, в DI — номер регистра (0-FFh, четный). При успешном возврате в СХ — считанное слово.

♦ АХ = В10Ah — чтение двойного слова конфигурационного пространства устройства PCI . При вызове в ВН — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции, в DI — номер регистра (0-FFh, кратный 4). При успешном возврате в ЕСХ — считанное двойное слово.

♦ АХ = B10Bh — запись байта конфигурационного пространства устройства PCI . При вызове в ВН — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции, в DI — номер регистра (0-FFh), в CL — записываемый байт.

♦ АХ = B10Ch — запись слова конфигурационного пространства устройства PCI . При вызове в ВН — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции, в DI — номер регистра (0-FFh, четный), в СХ — записываемое слово.

♦ АХ = B10Ah — запись двойного слова конфигурационного пространства устройства PCI . При вызове в ВН — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции, в DI — номер регистра (0-FFh, кратный 4), в ЕСХ — записываемое двойное слово.

[6] Зная устройство современных винчестеров, здесь и далее не будем добираться до истинно физических параметров — реального номера цилиндра, головки и сектора.

Функции bios int 11h: проверка оборудования

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

Прерывание (interrupt, INT) – это приостановка центральным процессором выполнения приоритетной программы для обработки события, которое поступило от одного из устройств.

Механизм прерываний реализован следующим образом:

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

Контроллер прерываний (Programmable Interrupt Controller, PIC) – это микросхема (или встроенный в процессор модуль), которая выполняет обработку запросов на прерывание от различных устройств.

Каждому прерыванию присваивают число, называемое номером прерывания. Некоторые из номеров прерывания зарезервированы за определенными устройствами, некоторые можно освободить и использовать для других устройств. Обозначается прерывание символом IRQ.

Классификация прерываний.

1. Немаскируемые прерывания (Non-Maskable Interrupt, NMI). Прерывания с высшим приоритетом. Прерывания данного типа обрабатываются в случаях возникновения аварийных ситуаций, вызванных ошибками в работе памяти или других устройств.

2. Маскируемые (аппаратные) прерывания. В эту группу относят прерывания от периферийных устройств. Обрабатываются контроллером прерываний. Стандартный контроллер прерываний позволяет обращаться к 16 прерываниям от различных устройств. Сегодня имеется возможность использовать расширенный контроллер прерываний APIC.

APIC (Advanced Programmable Interrupt Controller) – расширенный программируемый контроллер прерываний, позволяющий использовать 24 аппаратных прерываний вместо 16.

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

Аппаратные прерывания и зарезервированные за ними устройства

Прерывание int 10h. Видеофункции BIOS

¨ Функция 00h. Установка видеорежима (табл. 3.2) текущей видеостраницы с очисткой экрана (быстрая очистка экрана реализуется функцией 06h и 07h).

Al = видеорежим (код режима задаётся в младших 7 битах, установка в 1 старшего бита запрещает очистку экрана).

Вызов разрушает регистры AX, BP, SI, и DI.

Текстовые видеорежимы и страницы в стандарте VGA, поддерживаемые
современными видеоконтроллерами

Режим Тип Разрешение Цвет Размер знака Адрес Страницы
text 40×25 полутонов 9×16 B8000 0 – 7
text 40×25 16/8 9×16 B8000 0 – 7
text 80×25 полутонов 9×16 B8000 0 – 7
text 80×25 16/8 9×16 B8000 0 – 7
graphic 640×200 / 80×25 8×8 B8000
text 80×25 3 (Mono) 9×16 B0000
10h graphic 640×350 / 80×25 4 или 16 8×14 A0000 0 – 1
11h graphic 640×480 / 80×30 2 (Mono) 8×16 A0000
12h graphic 640×480 / 80×30 8×16 A0000
13h graphic 640×480 / 80×30 8×8 A0000

По умолчанию в DOS используется режим 3 (впрочем, корректно оформленная программа должна выполнять проверку или установку требуемого текстового режима с последующим восстановлением прежнего).

¨ Функция 02h. Установка позиции курсора.

Задаёт положение курсора на экране в текстовых координатах, с которых в дальнейшем будет выводиться текст. Отсчёт номера строки и столбца ведётся от верхнего левого угла. Курсор можно установить как в текстовом, так и в графическом режиме, однако, в графическом режиме курсор не виден. BIOS поддерживает до восьми независимых курсоров – по одному на каждую страницу (см. табл. 3.2) независимо от того, какая страница является активной. Функцию 02h BIOS можно использовать в комбинации с функциями DOS для организации вывода на экран.

Вызов: AH = 02h; BH = номер страницы (0,1. 7),обычно 0;

DH = строка; DL = столбец.

Вызов разрушает регистры AX, BP, SI и DI.

¨ Функция 03h. Считывание позиции и размера курсора.

Возвращает текущие координаты состояния курсора на выбранной странице. Это даёт возможность временно перейти для работы на другое место экрана, а затем вернуться на старое место. Функцию 03h BIOS можно использовать в комбинации с функциями DOS для организации вывода на экран.

Вызов: AH = 03h, BH = номер страницы (0,1. 7),обычно 0.

Возврат: DH, DL = строка и столбец текущей позиции курсора,

CH, CL = первая и последняя строки развёртки курсора.

Вызов разрушает регистры AX, BP, SI и DI.

¨ Функция 05h. Установка видеостраницы.

Устанавливает активную видеостраницу (как текстовую, так и графическую).

Вызов: AH= 05h, AL= номер страницы (0. 7).

Вызов разрушает регистры AX, BP, SI и DI.

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

¨ Функция 06h (07h). Инициализация или прокрутка окна вверх (вниз).

Инициализирует окно с указанными координатами, пробелами ASCII с заданным атрибутом (AL = 0), или прокручивает содержимое окна вверх (вниз) на заданное число строк (AL = число строк). При прокрутке появляющиеся снизу (сверху) строки заполняются пробелами ASCII с заданным атрибутом. Функцию удобно использовать для быстрой очистки экрана или некоторого прямоугольного окна.

Вызов: AH = 06h(07h);

AL = 0 – очистка, AL = N (N >0) – прокрутка на N строк;

BH = атрибут символов в окне;

CH, CL = координаты строки и столбца (Y,X) левого верхнего угла;

DH, DL = координаты строки и столбца (Y,X) правого нижнего угла.

Вызов разрушает регистры AX, BP, SI, и DI.

¨ Функция 08h. Чтение символа и атрибута в текущей позиции курсора на выбранной странице.

Вызов: AH = 08h, BH = номер страницы (0. 7),обычно 0.

Возврат: AH = атрибут символа, AL = ASCII-код символа.

Вызов разрушает регистры BP, SI и DI.

¨ Функция 09h. Запись символа с заданным атрибутом на экран в позицию курсора. Действует как в графическом, так и в текстовом режимах. В графическом режиме символы не должны переходить на следующую строку. Все коды в AL рассматриваются как символьные и не управляют положением курсора. После вывода символа курсор смещается к следующей позиции функцией 02h. Коэффициент повторения позволяет выводить строки одинаковых символов. В текстовом режиме символ выводится с указанным в BL атрибутом. В графическом – содержимое BL влияет только на цвет символа, но не на фон под ним. Графическое изображение под знакоместом затирается.

Вызов: AH =09h, AL = ASCII-код символа,

BL = атрибут символа (текстовый режим) или только цвет символа (графический режим),

BH = номер страницы (0,1. 7), CX = коэффициент повторения.

Вызов разрушает регистры AX, BP, SI и DI.

¨ Функция 0Ah. Запись символа с текущим атрибутом на экран в позицию курсора. Функция действует как в графическом, так и в текстовом режимах. Символ принимает атрибут, установленный ранее для этой позиции. Все ASCII-коды в AL рассматриваются как символьные и не управляют положением курсора (также как и в функции 09h). После вывода символа курсор смещается к следующей позиции функцией 02h.

Вызов: AH = 0Ah, AL = ASCII-код символа,

BH = номер страницы (0,1. 7), CX = коэффициент повторения.

Вызов разрушает регистры AX, BP, SI и DI.

¨ Функция 0Eh. Запись символа с текущим атрибутом в режиме телетайпа.

Записывает символ ASCII в позицию курсора (предварительно установленную функцией 02h) на активной странице и смещает курсор к следующей позиции. Коды ASCII: 07h – звонок (BEL), 08h – шаг назад (BS), 0Dh – возврат каретки (CR), 0Ah – перевод строки (LF), рассматриваются как управляющие и выполняются соответствующие им действия. Остальные управляющие коды рассматриваются как символы и выводятся на экран. Действует автоматический перевод курсора на следующую строку после завершения предыдущей, а также прокрутка экрана вверх на 1 строку после заполнения самой нижней.

Вызов: AH = 0Eh, AL = ASCII-код символа,

BL = цвет символа (только для графического режима),

BH = номер страницы (0,1. 7), по умолчанию действует активная страница.

¨ Функция 0Fh. Получить режим дисплея и номер текущей страницы.

Возврат: AL = режим дисплея, AH = ширина экрана в текстовом формате

BH =номер активной страницы.

Вызов разрушает регистры BP, SI и DI.

Пример. Процедура установки позиции курсора на текущей странице.

Вход: dh = строка (0 – 25), dl = столбец (0 – 79)

. ;Сохранить регистры (по необходимости)

. ;Восстановить регистры

¨ Функция 10h. Подфункция 03h. Переключение бита «мерцание/яркость».

Определяет назначение старшего бита 7 атрибута символа: мерцание символа или повышенная яркость фона.

Вызов: AX = 1003h, BL = назначение 7-го бита атрибута:

0 – повышенная яркость, 1 – мерцание (устанавливается по умолчанию).

Функция воздействует сразу на все символы экрана, у которых установлен старший бит атрибута фона.

¨ Функция 13h. Запись строки символов с заданными атрибутами.

Записывает строку в текущую страницу видеобуфера, начиная с указанной позиции. Коды ASCII: 07h – звонок, 08h – шаг назад, 0Ah – перевод строки,
0Dh – возврат каретки, рассматриваются как управляющие, остальные – как символьные.

Вызов: AH = 13h, AL = режим записи:

0 – атрибут символа в BL, строка содержит только коды символов, после записи курсор принимает исходное положение (т.е. вывод следующей строки, если не изменить позицию курсора, начинается с изначально установленной позиции);

1 – отличается от режима 0 тем, что после записи курсор остаётся в конце строки;

2 – строка содержит попеременно коды символов и атрибутов (т.е. каждый символ описывается 2 байтами – ASCII-кодом и атрибутом), после записи курсор принимает исходное положение;

3 – отличается от режима 2 тем, что по окончании вывода курсор остаётся в конце строки.

BH = номер страницы (0,1. 7), BL = атрибут для режимов 0 и 1,

CX = длина символьной строки (в длину входят только коды символов, но не байты атрибутов),

DX = DH.DL = координаты курсора (строка, столбец) в исходной точке вывода строки на экране,

ES:BP = адрес начала строки в памяти.

Обратите внимание на особенность задания адреса!

Дата добавления: 2014-11-10 ; просмотров: 1698 . Нарушение авторских прав

Выбор режима работы — функция 00h

Функция 00h прерывания 10h позволяет задать любой стандартный режим работы видеоадаптера:

На входе: AH 00h
AL Номер устанавливаемого режима работы видеоадаптера, если бит D7 = 1, то при установке режима видеопамять не очищается
На выходе: Не используются

Приведем пример выбора режима видеоадаптера:

mov al, 3 ; Выбираем режим номер 3 (16 цветной, текстовый,

int 10h ; разрешение 25х80 символов)

Информацию о видеоадаптерах и его режимах можно найти, например:

1.«Библиотека системного программиста» — Александр Фролов, Григорий Фролов Том 21, Программирование видеоадаптеров, М.: Диалог-МИФИ, 1995, 271 стр.

2.http://www.codenet.ru/cat/Applications/Graphics/VGA-VESA-Standarts/

3.http://www.codenet.ru/progr/video/vbe-svga.php

4.и т.д.

Определение текущего режима работы видеоадаптера — функция 0Fh

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

На входе: AH 0Fh
На выходе: AH Количество символов в строке
AL Номер текущего режима
BH Номер активной страницы видеопамяти

Бит D7 регистра AL соответствует значению бита D7 регистра AL, использованному при предыдущем выборе режима работы видеоадаптера (см. функцию 0).

Список стандартных режимов работы видеоадаптеров представлен в следующей таблице:

Режим работы Тип информации Количество цветов Разрешение, пиксел x пиксел Размер символов, пиксел x пиксел
0, 1 Текстовый цветной 40×25 8×8
0*, 1* Текстовый цветной 40×25 8×14
0+, 1+ Текстовый цветной 40×25 9×16
2, 3 Текстовый цветной 80×25 8×8
2*, 3* Текстовый цветной 80×25 8×14
2+, 3+ Текстовый цветной 80×25 9×16
4, 5 Графический цветной 320×200
Графический цветной 640×200
Текстовый монохромный 80×25 9×14
7+ Текстовый монохромный 80×25 9×16
8, 9, 0Ah Используются видеоадаптерами компьютера PC jr, и в настоящее время интереса не представляют
0Bh, 0Ch Зарезервировано
0Dh Графический цветной 320×200
0Eh Графический цветной 640×200
0Fh Графический монохромный 640×350
10h Графический цветной 640×350
11h Графический цветной 640×480
12h Графический цветной 640×480
13h Графический цветной 320×200

Приведем список режимов работы видеоадаптеров, соответствующих стандарту VESA:

Режим работы Тип информации Количество цветов Разрешение, пиксел x пиксел Размер символов, пиксел x пиксел
100h Графический цветной 640×400
101h Графический цветной 640×480 8х16
102h Графический цветной 800×600 8х8
103h Графический цветной 800×600 8х8
104h Графический цветной 1024×768
105h Графический цветной 1024×768 8х16
106h Графический цветной 1280×1024
107h Графический цветной 1280×1024
108h Текстовый цветной 80×60
109h Текстовый цветной 132×25 9х16
10Ah Текстовый цветной 132×43 9х9
10Bh Текстовый цветной 132×50
10Ch Текстовый цветной 132×60
10Dh Графический цветной 320×200
10Eh Графический цветной 320×200
10Fh Графический цветной 320×200
110h Графический цветной 640×480
111h Графический цветной 640×480
112h Графический цветной 640×480
113h Графический цветной 800×600
114h Графический цветной 800×600
115h Графический цветной 800×600
116h Графический цветной 1024×768
117h Графический цветной 1024×768
118h Графический цветной 1024×768
119h Графический цветной 1024×768
11Ah Графический цветной 1280×1024

Int 11h — Конфигурация оборудования

Для варианта №11, Лабораторной работы №2 — Определить и вывести на экран список оборудования (BIOS 11h).

Вход: нет

Выход: AX=конфигурация оборудования

Описание: Возвращает в AX конфигурацию оборудования ПЭВМ.

Примечания:

1.Это слово хранится в области данных BIOS по адресу 00410h.

2.На IBM PC, XT и PCjr биты 2-3 содержат объем ОЗУ на системной плате в блоках по 16К (например, 00=16К, 11=64К).

3.Бит 2 не используется на PC, XT, AT и PC Convertible. На XT-286 и PS/2 он указывает на наличие устройства графического ввода (pointing device).

4.Бит 12 всегда установлен в 1 на PCjr.

5.Бит 13 указывает наличие встроенного модема на PC Convertible, последовательного принтера на PCjr и зарезервирован на остальных ПЭВМ.

6.Если DIP-переключатели в PC и XT выставлены неверно, то BIOS не определит наличие сопроцессора. Для проверки того, имеет ли ЭВМ сопроцессор, лучше всего выполнить его команду и проанализировать результат.

7.Для определения числа жестких дисков используйте Int 13h, функцию 08h.

Приведем назначение отдельных битов слова конфигурации:

Биты Значение
1 — система содержит НМД;0 — система не содержит НМД.(Для варианта №1, Лабораторной работы №2 — Определить наличие и тип установленного в системе накопителя на жестких магнитных дисках (НЖМД).)
1 1 — установлен арифметический сопроцессор;0 — арифметический сопроцессор не установлен.
2-3 Объем основной памяти, установленной на материнской плате:Биты: 3 2 0 1 — 16К; 1 0 — 32К; 1 1 — 64К и более.(Для варианта №2, Лабораторной работы №2 — Определить объем установленной оперативной памяти и ее тип.)
4-5 Тип дисплейного контроллера и его режим:Биты: 5 4 0 0 — не используется или EGA; 0 1 — CGA, EGA, VGA в режиме 40×25; 1 0 — CGA, EGA, VGA в режиме 80×25; 1 1 — монохромный контроллер.(Для варианта №12, Лабораторной работы №2 — Определить режим видеоадаптера (текстовый, графический, разрешение) (BIOS 10h).
6-7 Количество установленных НГМД:Биты: 7 6 0 0 — установлен 1 НГМД; 0 1 — установлено 2 НГМД; 1 0 — установлено 3 НГМД; 1 1 — установлено 4 НГМД.(Для варианта №8, Лабораторной работы №2 — Определить количество и тип установленных накопителей на гибких магнитных дисках (НГМД).)
8 1 — используется контроллер прямого доступа к памяти;0 — контроллер прямого доступа к памяти не используется.
9-11 Количество установленных портов последовательной передачи данных RS232S:000 — нет портов;001 — используется один порт;111 — используется 7 портов.(Для варианта №4, Лабораторной работы №2 — Определить количество установленных последовательных и параллельных портов.)
12 1 — используется игровой адаптер (джойстик);0 — игровой адаптер не используется.
13 1 — установлен последовательный принтер (только для PC Jr).
14-15 Количество установленных принтеров:00 — нет принтеров;01 — используется 1 принтер;10 — используется 2 принтера;11 — используется 3 принтера.(Для варианта №4, Лабораторной работы №2 — Определить количество установленных последовательных и параллельных портов.)

Пример:

// Получение информации о конфигурации компьютера при помощи BIOS

Илон Маск рекомендует:  Три колонки
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL