Функции dos int 27h завершиться, но остаться резидентным


Содержание

Операционная система MS-DOS

5. Резидентные программы

  • 5.1. Что такое резидентная программа
  • 5.2. Как программе стать резидентной
  • 5.3. Вызов резидентной программы
  • 5.4. Особенности резидентных программ
  • 5.5. Примеры резидентных программ

5.1. Что такое резидентная программа?

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

Остающиеся в памяти после завершения своей работы программы называются резидентными или TSR (Terminate and Stay Resident).

Для чего может понадобиться составление TSR-программ?

Существует несколько приложений, для которых подходят TSR-программы. Чаще всего TSR-программы используются для русификации импортных персональных компьютеров. Написано множество программ для загрузки русских шрифтов в память видеоадаптеров, для печати русских букв на принтере в графическом режиме, для русификации клавиатуры и т.п. Для всех этих программ характерно то, что они запускаются один раз при загрузке компьютера — их имена обычно включают в AUTOEXEC.BAT. Эти программы могут переключать на себя обработку прерываний, связанных с выводом на печать или с обращением к клавиатуре и/или выполнять разовые инициализирующие действия, такие как загрузка русских шрифтов в память видеоадаптера.

Другим примером использования TSR-программ могут служить программы резидентных калькуляторов, справочных баз данных типа Norton Guide или целых интегрированных систем наподобие Sidekick фирмы Borland. Такие программы тоже обычно запускаются через AUTOEXEC.BAT или при необходимости. Они перехватывают клавиатурные прерывания и отслеживают нажатие клавиш. Как только обнаруживается нажатие определенной заранее клавиши, поверх имеющегося на экране изображения выводится окно диалога резидентной программы.

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

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

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

TSR-программы не могут свободно пользоваться прерываниями DOS из-за того, что программы DOS (и BIOS) не обладают свойством реентерабельности. Об этом мы будем говорить при обсуждении особенностей резидентных программ.

5.2. Как программе стать резидентной?

У вас есть две возможности оставить свою программу резидентной в памяти — использовать прерывание INT 27h или функцию 31h прерывания INT 21h.

Для использования прерывания 27h сегментный регистр CS должен указывать на PSP программы, а в регистре DX должно быть записано смещение последнего байта программы плюс один байт. Нетрудно заметить, что этот способ остаться резидентной больше всего подходит для программ в формате COM. Вы не сможете оставить резидентной программу длиннее 64 килобайт.

Другой, более удобный способ — использовать функцию 31h прерывания INT 21h. В регистре AL вы можете указать код завершения программы, регистр DX в этом случае должен содержать длину резидентной части программы в параграфах. Здесь уже нет ограничения 64 килобайта на длину программы. Использование этой функции — единственная возможность оставить резидентной программу длиннее 64 килобайт.

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

Библиотека функций Quick C содержит специальную функцию для оставления программы резидентной в памяти. Эта функция использует прерывание INT 21h (функция 31h) и имеет имя _dos_keep(). Первый параметр функции — код завершения (то, что записывается в регистр AL), а второй — длина резидентной части программы в параграфах.

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

5.3. Вызов резидентной программы

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

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

Самый простой способ организовать связь оператора с TSR-программой — это использовать прерывание по нажатию клавиши печати содержимого экрана PrtScr. Но при этом вы теряете возможность распечатки содержимого экрана. Впрочем, иногда вам и нужно, чтобы вместо печати содержимое экрана записывалось, например, в файл. Или вы можете составить свою собственную программу печати содержимого экрана (используя графическую печать или какие-либо особенности принтеров).

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

Подробно о работе с клавиатурой и о 9-м прерывании будет рассказано во втором томе книги.

5.4. Особенности резидентных программ

TSR-программы имеют некоторые особенности, отличающие их от «нормальных» программ.

Им не разрешается использовать DOS-прерывания, когда вздумается. Это связано с тем, что DOS проектировалась как однозадачная операционная система, поэтому модули DOS не обладают свойством реентерабельности (повторной входимости). Что это означает на практике?

Допустим, Ваша программа записывает длинный файл на диск. Во время записи вы (возможно, случайно) нажали клавишу, активизирующую TSR-программу записи содержимого экрана в файл.

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

И таких примеров можно привести много. BIOS также далеко не весь реентерабельный. TSR-программа может смело использовать разве лишь прерывание 16h для работы с клавиатурой, которое реентерабельно. Для вывода на экран лучше всего использовать непосредственную запись символов в видеопамять дисплейного адаптера.

Не стоит пользоваться многими функциями библиотеки Quick C, так как они могут вызывать прерывания DOS. Например, функция malloc() вызывает прерывание DOS для определения размера свободной памяти в системе.

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

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

Это прерывание вызывается DOS при ожидании ввода с клавиатуры. В этот момент вы можете использовать любое прерывание DOS, кроме функций от 00h до 0Сh прерывания INT 21h. Утилита спулинга печати PRINT.COM использует это прерывание.

Можно рекомендовать следующий способ использования прерывания 28h. Обработчик прерывания 9 отслеживает нажатие клавиши, которая должна активизировать TSR-программу. Обнаружив эту клавишу (или комбинацию клавиш), обработчик прерывания 9 устанавливает флаг запроса на активизацию TSR-программы и завершает свою работу обычным способом.

Ваша TSR-программа должна создать свой обработчик прерывания 28h и сцепить его со стандартным. Каждый раз, когда DOS ожидает ввода с клавиатуры (в этот момент DOS не использует сама свои прерывания), вызывается прерывание 28h. Ваш обработчик проверяет флаг активизации, устанавливаемый обработчиком прерывания 9, и если флаг установлен, TSR-программа активизируется и может пользоваться услугами DOS, в частности, файловой системой.

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

Можно также вместе с прерыванием 28 использовать аппаратное прерывание таймера с номером 8. В этом случае надо проверять не только флаг активизации, но и так называемый флаг критической секции DOS. Это байт, адрес которого возвращает недокументированная функция 34h прерывания DOS 21h в регистрах ES:BX. Если этот байт равен 0, то DOS не использует свои прерывания и наступил подходящий момент для активизации TSR-программы.

TSR-программа может вступить в конфликт с другими TSR-программами или прикладным обеспечением, если будет использовать занятые ими номера прерываний. Известен случай, когда драйвер клавиатуры и экрана (SDRIVER) вызывал зависания программных продуктов фирмы Microsoft из-за того, что эти продукты выдавали 16h прерывание с содержимым регистра AX равным 5500h, 5501h и т.д. Обработчик 16h-го прерывания программы SDRIVER при этом зацикливался из-за ошибки в программе (или точнее, из-за плохой реакции на такого рода номера функций прерывания 16h).

Очень важно не допустить случайного повторного запуска TSR-программы, так как повторное переназначение векторов прерываний почти наверняка приведет систему к краху.

Для проверки наличия TSR-программы в памяти обычно используют прерывание мультиплексора 2Fh, специально предназначенное для организации элементов мультизадачности в DOS. Это прерывание используется спулером печати PRINT.COM (об этом мы будем говорить при описании работы с принтером).

TSR-программа может переназначить это прерывание на себя и сделать так, чтобы оно «откликалось» на какой-либо код функции, зарезервированный для прикладных программ. Можно использовать коды C0h. FFh. При запуске TSR-программа вызывает прерывание 2Fh с выбранным кодом и проверяет ответ (передаваемый, например, в регистре AX). Если прерывание отвечает тем кодом, который задан в TSR-программе, это означает, что копия программы уже есть в памяти и повторная установка недопустима.

Приведенные ниже примеры проиллюстрируют все эти особенности.

5.5. Примеры резидентных программ

Приведем несколько примеров TSR-программ.

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

Следующая программа GRAB демонстрирует использование функций DOS в TSR-программах. Она содержит все элементы, необходимые «безопасным» резидентным программам.

Программа предназначена для копирования содержимого видеобуфера в файл. Запись в файл активизируется при нажатии комбинации клавиш Ctrl+PrtSc. После каждой записи имя файла изменяется.

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

Итак, текст программы:

Приведем пример TSR-программы, написанной на языке ассемблера. Эта программа переназначает прерывание 13h, которое используется для работы с дисками. Она позволяет организовать защиту диска от записи. При первом запуске программа включает защиту, при втором выключает, потом опять включает и так далее. В качестве флага — признака включения или выключения защиты, используется компонента смещения вектора прерывания F0h, зарезервированного для интерпретатора BASIC.

Этим примером мы завершим обзор TSR-программ. В следующей главе будет описан другой вид резидентных программ — драйверы. Использование драйвера — более предпочтительный, чем TSR-программы способ организовать обслуживание нестандартной аппаратуры.

Функция 25h: Установить вектор прерывания

Вход AH = 25h

AL = номер прерывания

DS:DX = вектор прерывания: адрес программы обработки прерывания

Описание: Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и гарантирует, что в момент записи прерывания будут заблокированы.

Внимание: Не забудьте восстановить DS (если необходимо) после этого вызова.

Функция 26h: Построить PSP

DX = адрес сегмента (параграфа) для нового PSP

CS = сегмент PSP, используемого как шаблон для нового PSP

Описание: Устанавливает PSP для порождаемого процесса по адресу DX:0000. Текущий PSP (100h байт, начиная с CS:0), копируется в DX:0. Соответственно корректируется поле MemTop. Векторы Terminate, Ctrl-Break и Critical Error копируются в PSP из векторов прерываний int 22h, int 23h и int 24h.

Функция 2ah: Дать системную дату

Вход AH = 2ah

Выход AL = день недели (0 = воскресенье, 1 = Понедельник. )

CX = год (от 1980 до 2099)

DH = месяц (от 1 до 12)

DL = день (от 1 до 31)

Описание: Возвращает текущую системную дату.

Функция 2bh: Установить системную дату

Вход AH = 2bh

CX = год (от 1980 до 2099)

DH = месяц (от 1 до 12)

DL = день (от 1 до 31)

Выход AL = 0, если дата корректна

AL = 0ffh если дата некорректна

Описание: Устанавливает системную дату DOS.

Функция 2ch: Дать системное время

Вход AH = 2ch

Выход CH = часы (от 0 до 23)

CL = минуты (от 0 до 59)

DH = секунды (от 0 до 59)

DL = сотые доли секунды (от 0 до 99)

Описание: Возвращает текущее системное время.

Замечание: Поскольку системные часы имеют частоту 18.2 тиков в секунду (интервал 55мс), DL имеет точность 0.04 сек.

Функция 2dh: Установить системное время

Вход AH = 2dh

CH = часы (от 0 до 23)

CL = минуты (от 0 до 59)

DH = секунды (от 0 до 59)

DL = сотые доли секунды (от 0 до 99)

Выход AL = 0, если время корректно

AL = 0ffh если время некорректно

Описание: Устанавливает системное время.

Функция 2eh: Установить/сбросить переключатель верификации

Вход AH = 2eh

AL = 0 отключить верификацию

AL = 1 включить верификацию

Описание: Устанавливает, должна ли DOS проверять каждый сектор, записываемый на диск. Это замедляет операции записи на диск, но дает некоторую гарантию при записи. Функция 56h Get Verify возвращает текущий статус верификации DOS.

Функция 2fh: Дать адрес текущей DTA

Вход AH = 2fh

Выход ES:BX = адрес начала текущей DTA

Описание: Возвращает адрес начала области передачи данных (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться сохранить адрес DTA, а впоследствии восстановить его посредством функции 1ah «Установить DTA».

Замечание: Эта функция изменяет сегментный регистр ES.

Функция 30h: Дать номер версии DOS

Вход AH = 30h

Выход AL = часть номера версии до точки

AH = часть номера версии после точки

BX,CX = 0000h DOS 3.0+

Описание: Возвращает в AX значение текущего номера версии DOS. Например, для DOS 3.2, в AL возвращается 3, в Ah — 2.

Замечание: Если в AL возвращается 0, можно предполагать, что работает DOS более ранней версии, чем DOS 2.0.

Функция 31h: Завершиться и остаться резидентным (KEEP)

AL = код возврата

DX = объем оставляемой резидентной части в параграфах

Описание: Выходит в родительский процесс, сохраняя код возврата в AL. Код возврата можно получить через функцию 4dh Wait. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную часть резидентной (число байтов = DX*16). Эта функция перекрывает функцию int 27h, которая не возвращает код возврата и неспособна установить резидентную программу больше сегмента.

Функция 33h: Установить/опросить статус Ctrl-Break

Вход AH = 33h

AL = 0 чтобы опросить текущий статус контроля Ctrl-Break

AL = 1 чтобы установить статус контроля Ctrl-Break

DL = требуемый статус (0=OFF, 1=ON) (только при AL=1)

Выход DL = текущий статус (0 = OFF, 1 = ON)

Описание: Если AL=0, в DL возвращается текущий статус контроля Ctrl-Break. Если AL=1, в DL возвращается новый текущий статус. Когда статус ON, DOS проверяет на Ctrl-Break с консоли для большинства функций (исключая 06h и 07h). При обнаружении, выполняется int 23h (если оно не перехватывается, то это снимает процесс). Когда статус OFF, DOS проверяет на Ctrl-Break лишь при операциях стандартного в/в, стандартной печати и стандартных операциях AUX.

Функция 35h: Дать вектор прерывания

Вход AH = 35h

AL = номер прерывания (от 00h до 0ffh)

Выход ES:BX = адрес обработчика прерывания

Описание: Возвращает значение вектора прерывания для int (AL); то есть, загружает в BX 0000:[AL*4], а в ES — 0000:[(AL*4)+2].

Внимание: Эта функция изменяет сегментный регистр ES.

Функция 36h: Дать свободную память диска

Вход AH = 36h

DL = номер диска (0=текущий, 1=A, и т.д.)

Выход AX = 0ffffh, если AL содержал неверный номер диска

АХ = число секторов на кластер, если нет ошибок

BX = доступных кластеров

CX = байт на сектор

DX = всего кластеров на диске

Описание: Возвращает данные для подсчета общей и доступной дисковой памяти. Если в AX возвращено 0ffffh, значит, вы задали неверный диск. Иначе, свободная память в байтах = (AX * BX * CX) всего памяти в байтах = (AX * CX * DX).

Функция 39h: Создать новый каталог (MKDIR)

Вход AH = 39h

DS:DX = адрес строки ASCIIZ с именем оглавления

Выход AX = код ошибки если CF установлен

Описание: DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имя_каталога»,0. Если диск и/или путь опущены, то берется каталог, принятый по умолчанию. Подкаталог создается и связывается с существующим деревом. Если при возврате, установлен флаг CF, то AX содержит код ошибки, и каталог не создается.

Функция 3ah: Удалить каталог (RMDIR)

Вход AH = 3ah

DS:DX = адрес строки ASCIIZ с именем оглавления

Выход AX = код ошибки, если установлен CF

Описание: DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имя_каталога»,0. Если диск и/или путь опущены, то берется каталог, принятый по умолчанию. Подкаталог удаляется из указанного каталога. Если при возврате, установлен флаг CF, то AX содержит код ошибки, и каталог не удаляется.

Замечание: Каталог не должен содержать файлов и подкаталогов, а также и не должен быть связан с возможными ограничениями DOS (например, каталог не должен быть задействован в активных командах JOIN или SUBST).

Функция 3bh: Установить текущий каталог DOS (CHDIR)

Вход AH = 3bh

DS:DX = адрес строки ASCIIZ с именем каталога

Выход AX = код ошибки, если установлен CF

Описание: DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имя_каталога»,0. Если диск и/или путь опущены, то берется каталог, принятый по умолчанию. Указанный подкаталог для указанного диска становится текущим каталогом DOS для этого (или текущего) диска. Если при возврате установлен флаг CF, то AX содержит код ошибки, и текущий каталог для выбранного диска не изменяется.

Функция 3ch: Создать файл через дескриптор

Вход AH = 3ch

DS:DX = адрес строки ASCIIZ с именем файла

CX = атрибут файла

Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если ошибки нет

Описание: DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. файл создается в указанном (или текущем) каталоге файл открывается в режиме доступа чтение/запись вы должны сохранить дескриптор (handle) для последующих операций, если файл уже существует:

· при открытии файл усекается до нулевой длины

· если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43h Изменить Атрибут)

Резидентные программы

Popf

Mov eax,word ptr old_handler

Cli

Pushf

Pop es

Push 0

Popf

Cli

Pushf

Mov dword ptr old_handler,eax

Pop es

Push 0

Обработчики прерываний

Когда в реальном режиме выполняется команда INT, управление передается по адресу, который считывается из специального массива, таблицы векторов прерываний, начинающегося в памяти по адресу 0000h:0000h. Каждый элемент этого массива представляет собой дальний адрес обработчика прерывания в формате сегмент:смещение или 4 нулевых байта, если обработчик не установлен. Команда INT помещает в стек регистр флагов и дальний адрес возврата, поэтому, чтобы завершить обработчик, надо выполнить команды popf и retf или одну команду iret, которая в реальном режиме полностью им аналогична.

; Пример обработчика программного прерывания

int_handler proc far

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

push 0 ; сегментный адрес таблицы векторов прерываний

pushf ; поместить регистр флагов в стек

cli ; запретить прерывания

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

; командами, обработчик которого теоретически может вызвать INT 87h

; в тот момент, когда смещение уже будет записано, а сегментный

; адрес еще нет, что приведет к передаче управления в неопределенную область памяти)

; поместить дальний адрес обработчика int_handler в таблицу

; векторов прерываний, в элемент номер 87h (одно из неиспользуемых прерываний)

mov word ptr es:[87h*4], offset int_handler

mov word ptr es:[87h*4+2], seg int_handler

popf ; восстановить исходное значение флага IF

Теперь команда INT 87h будет вызывать наш обработчик, то есть приводить к записи 0 в регистр АХ.

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

; скопировать адрес предыдущего обработчика в переменную old_handler

mov eax,dword ptr es:[87h*4]

; установить новый наш обработчик

mov word ptr es:[87h*4], offset int_handler

mov word ptr es:[87h*4+2], seg int_handler

; тело программы

; восстановить предыдущий обработчик

mov word ptr es:[87h*4],eax

Для изменения таблицы векторов прерываний в обычных программах, DOS предоставляет две системные функции: 25h и 35h — установить и считать адрес обработчика прерывания, которые и рекомендуются к использованию в обычных условиях.

; скопировать адрес предыдущего обработчика в переменную old_handler

mov ax,3587h ; АН = 35h, AL = номер прерывания

int 21h ; функция DOS: считать адрес обработчика прерывания

mov word ptr old_handler,bx ; возвратить смещение в ВХ

mov word ptr old_handler+2,es ; и сегментный адрес в ES,

; установить наш обработчик

mov ax,2587h ; АН = 25h, AL = номер прерывания

mov dx,seg int_handler ; сегментный адрес

mov dx,offset int_handler ; смещение в DX

int 21h ; функция DOS: установить обработчик

; восстановить предыдущий обработчик

lds dx,old_handler ; сегментный адрес в DS и смещение в DX

mov ax,2587h ; АН = 25h, AL = номер прерывания

int 21h ; установить обработчик

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

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

Функция DOS 31h: Оставить программу резидентной

Ввод: АН = 31h AL = код возврата DX = размер резидента в 16-байтных параграфах (больше 06h), считая от начала PSP

Кроме того, существует и иногда используется предыдущая версия этой функции — прерывание 27h:

INT 27h: Оставить программу резидентной

Ввод: АН = 27h DX = адрес последнего байта программы (считая от начала PSP) + 1

Эта функция не может оставлять резидентными программы размером больше 64 Кб, но многие программы, написанные на ассемблере, соответствуют этому условию. Так как резидентные программы уменьшают объем основной памяти, их всегда пишут на ассемблере и оптимизируют для достижения минимального размера.

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

Программа N 01 (первый обработчик прерывания). Записывает в оперативную память пассивный резидент, который для любой программы реагирует на прерывание 21h так, что выводит свою строку ‘My string!$’.

assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG

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

; Ниже идет, код обработчика прерывания 21h прерывания (он будет резидентный). После того, как программа выйдет, процедура Int_21h_proc останется в памяти и будет контролировать функцию 09 прерывания 21h.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Учись учиться, не учась! 10389 — | 7889 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Функции dos int 27h: завершиться, но остаться резидентным

При закрытии подписчики были переданы в рассылку «RFpro.ru: Ассемблер? Это просто! Учимся программировать» на которую и рекомендуем вам подписаться.

Вы можете найти рассылки сходной тематики в Каталоге рассылок.

Статистика

Уроки ассемблеру. Быстро и просто. Урок 13

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

Допустим, у нас есть программа из второго урока, выводящая на экран строку «Hello, world!». Нам нужно написать свою программу, которая бы осталась резидентной в памяти, но при этом перехватывала прерывания 21h таким образом, что при запуске первой программы (откомпилируем её как hello.com) выводилась бы строка не «Hello, world!», а «Goodbye, world!».

Рассмотрим текст такой программы.

;Всё, что следует за значком «;» — это комментарий.

.286 ;Разрешает ассемблирование непривилегированных инструкций
;процессора 80286 (реальный режим) и инструкций арифметического
;сопроцессора 80287.

CSEG segment ;Даём имя сегменту, а точнее определяем абсолютный
;сегмент в памяти программ по определённому адресу.
;Имя нашего сегмента будет CSEG.

assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG ;Задаём сегментные регистры, которые будем использовать для
;вычисления действующего адреса для всех меток и переменных, опре-
;делённых для сегмента или группы сегментов с указанным именем.

org 100h ;Программа типа .com

begin: ;Метка начала программы.

jmp Nerezident ;Прыгаем сразу за кодом резидента — продолжаем программу.

Rezident proc ;Начало нашей подпрограммы, которая останется в памяти.

pushf ;Сохраняем все флаги в стеке. Это нужно для того,
;чтобы не нарушить работу программы. В частности,
;следующие 2 строчки значение одного флага изменят (je).

cmp ah,9 ;Проверяем: это функция 09h?
je metka ;Если да, то переходим на метку

popf ;Если нет, восстановим регистр флагов и
jmp dword ptr cs:[Peremennaja_21h] ;перейдём на оригинальный обработчик прерывания 21h.
;А именно он находится в сегменте cs по адресу,
;содержащемуся в регистре (см.квадратные скобки).

push ds ;Сохраним регистр ds.
push dx ;Сохраним регистр dx.

push cs ;Сохраним регистр cs.
pop ds ;»Вытолкнем» последнее значение cs в ds.

mov dx,offset Goodbye_world ;Занесём в dx адрес смещения нашей строки.

pushf ;Сохраним значение всех флагов в стеке.
call dword ptr cs:[Peremennaja_21h] ;Вывели нашу строку вместо той, которую надо было.

pop dx ;Восстановим регистр dx из стека.
pop ds ;Восстановим регистр ds из стека.

popf ;Восстановим флаги.

iret ;Выйдем из прерывания и продолжим работу.

Peremennaja_21h dd ? ;Определяем переменную для хранения оригинального адреса
;обработчика 21h.

Goodbye_world db ‘Goodbye, world!$’ ;Определяем переменную Goodbye_world, доступную побайтно, с фразой
;»Goodbye, world». В одинарных кавычках, после знака «!» ставим
;знак «$».

Rezident endp ;Конец подпрограммы.

Nerezident: ;Здесь закончился резидент.

mov ah,35h ;AH содержит номер функции 35h — получение адреса прерывания.
mov al,21h ;AL указывает номер прерывания, которое перехватываем.

int 21h ;Выполняем функцию.
;в ES:BX получаем адрес 21h прерывания (ES — сегмент, BX — смещение).

mov word ptr Peremennaja_21h,bx ;Загружаем в Peremennaja_21h слово (2 байта) из BX,
;где находится смещение.

mov word ptr Peremennaja_21h+2,es ;А следующим словом — из ES (смещение).

mov ax,2521h ;Перехватываем прерывание.

mov dx,offset Rezident ;DX должен указывать на наш обработчик (смотри HELP.EXE).

int 21h ;Осуществляем прерывание. Мы не вызываем резидент командой
;call Rezident, а используем эти три строчки, начиная с mov ax,2521h

mov dx,offset Nerezident ;Оставляем программу резидентной: в dx — смещение по адресу
;метки Nerezident — указываем последний байт, остающийся в памяти.
int 27h ;Осуществляем прерывание и выходим в DOS (но оставляем резидента).

CSEG ends
end begin

Сохраним её как test.com (ml test.asm /AT). Запускаем сначала её, а затем hello.com (при использовании Far поместите hello.com в каталог с нашей программой. Дело в том, что при запуске test.com мы в оболочку не вернёмся и просто будем вводить в командной строке hello.com).

Мы видим, что на экран выводится фраза «Goodbye, world!», при этом текст программы hello.com остался прежним. Что же произошло?

Рассмотрим нашу подпрограмму, которая будет резидентной. Она начинается словами Rezident proc и заканчивается Rezident endp. Первоначально мы сохраняем все флаги в стеке (новая для нас функция pushf), затем проверяем, используется ли какой-либо программой функция 9h (вывод строки на экран). Если нет, переходим на «настоящий» обработчик функции 9h прерывания 21h (перед этим восстановив флаги, «испорченные» je metka. Если же да, то сохраняем значение в регистров ds и dx, и заносим в ds уже другое число — из cs. Что в нём было? Посмотрите в отладчике.

Затем добавляем в регистр dx адрес смещения, где располагается наша новая фраза. Значение ds и dx полностью изменились с прошлого раза. И сохраняем флаги. Строчка call dword ptr cs:[Peremennaja_21h] служит нам для вывода нашей новой строки.

Далее мы «вынимаем» старые значения ds и dx из стека, а затем восстанавливаем флаги. Обратите внимание на порядок. Потом идёт команда выхода из прерывания (опять новый оператор, здесь прослеживание аналогия с командой ret.

Теперь рассмотрим остальную (нерезидентную) часть программы, которую не будет больше использовать процессор.

HELP.EXE -> Указатель функций DOS/BIOS -> Функции DOS -> 35H GetVector

Читаем: DOS Fn 35H: Дать вектор прерывания. Вход: AH — 35h. AL — номер прерывания (00H до 0ffH).
Выход: ES:BX — адрес обработчика прерывания.

Описание: Возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX 0000:[AL*4], а в ES — 0000:[(AL*4)+2].
Предупр: Эта функция изменяет сегментный регистр ES.

Благодаря этой функции мы получаем в BX адрес обработчика прерывания, который и используем в следующих командах. Определяя переменную Peremennaja_21h dd ? и зарезервировав под неё двойное слово, мы можем занести в неё данные из BX и ES.

Следующие три строчки (начиная с mov ax,2521h):

HELP.EXE -> Указатель функций DOS/BIOS -> Функции DOS -> 25H Set Vector

Вход: AH — 25H
AL — номер прерывания
DS:DX — вектор прерывания: адрес программы обработки прерывания.

Следующие две строчки (начиная с mov dx,offset Nerezident):

Функции dos int 27h: завершиться, но остаться резидентным

Дистрибутив операционной системы 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, когда она получает сообщение об ошибке от драйвера устройства.

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

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

Whatis.Ru

Информация о компьютерах доступным языком
Назад на сайт

Страниц: 1 2

#26 18-01-2011 19:35:39

Re: . Введение в Ассемблер

Программа DEBUG

Программируем под DOS на ассемблере, используя виндовый DEBUG.

Программа DEBUG — мощный отладчик, входящий в состав Windows. Для запуска — жмём [Win+R] и вводим DEBUG. Перед нами мигающий курсор. Введём знак вопроса ? и получим список команд:

— A (assemble) — Создание двоичного кода процессоров 8086 непосредственно в памяти.
— С (compare) — Сравнение двух блоков памяти.
— D (dump) — Просмотр содержимого заданного диапазона адресов памяти.
— E (enter) — Ввод данных в память по заданному адресу.
— F (fill) — Заполнение адресов в области памяти заданными значениями.
— G (go) — Выполнение загруженной программы.
— H (hexadecimal) — Выполнение шестнадцатеричных арифметических операций.
— I (input) — Считывание и вывод на экран одного байта из указанного порта ввода.
— L (load) — Загрузка файла или содержимого сектора диска в память.
— M (move) — Копирование содержимого одного блока памяти в другой.
— N (name) — Задание имени исполняемого файла, L (load) или W (write).
— O (output) — Вывод байта в порт вывода.
— P (proceed) — Выполнение цикла, инструкции, прерывания или процедур.
— Q (quit) — Выход из Debug, без сохранения тестируемого файла.
— R (register) — Редактирование содержимого регистров ЦПУ.
— S (search) — Поиск в области памяти по шаблону.
— T (trace) — Выполнение одной инструкции с выводом содержимого регистров.
— U (unassemble) — Дезассемблирование и просмотр исходного кода программы.
— W (write) — Запись файла на диск.

Подробное описание команд с примерами можно найти в справке винды ([Win+F1]debug).

Теперь, запустим DEBUG и просмотрим, что у нас в регистрах. Вводим команду «R». Как видим, значение всех регистров процессора равняется нулю:

AX, BX, CX, DX = 0000

Мы можем вносить требуемые значения в регистры.

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#27 18-01-2011 19:39:28

Re: . Введение в Ассемблер

Пишем прогу на ассемблере.

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

1) Создадим *.сом в программе DEBUG
2) Дизассемблируем его, при помощи того-же DEBUG
3) Полученные 16-тиричные значения и есть инструкции, которые выполняет процессор

Итак, начнём с создания *.сом, который выведет символ на экран. Запустим DEBUG и введём команду «А». Дальше, «топчем клаву» как на рисунке:

Чтоб вывести символ на экран, в регистр AH помещается 02H, а в DL — код выводимого символа, плюс 30H. Далее вызываем прерывание-DOS INT 21H (вывод на экран), и закрываем программу дёрнув прерывание INT 20H (exit). Всё, что находится после INT 20H игнорируется процессором.

В листинге дизассемблирования указывается сегмент памяти, в который была загружена наша программа (13F2) и смещение внутри сегмента 100H, обязательное для СОМ-файлов. Необходимо помнить, что прикладные программы загружаются в первую-свободную область памяти, поэтому у Вас значение 13F2 может быть другим, в зависимости от свободной памяти.

Следующим столбцом в дизассемблерном листинге идут 16-тиричные значения (выделены серым), которые представляют собой непосредственные инструкции процессору. Ниже — уже ничего нет, ..только ядро. Вообще-то есть ещё интерператор 16-тиричных чисел в двоичные, но он невсчёт. В конечном виде наша программа TEST_PROGA.COM обрабатывается процессором в таком вот виде:

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

C++ Builder 4 — 22kb
Delphi 5 — 291kb
Delphi 5 + библиотека KOL — 26kb
Ассемблер MASM — около 3kb

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

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#28 19-01-2011 01:37:15

Re: . Введение в Ассемблер

..а вон чё WinHex показывает:

Да такой код можно хоть-куда пихнуть, ..к примеру в заголовок EXE-файла. Там столько свободного пространства, что можно слона разместить. 200-300h байт всегда найдётся. ..а нам больше и не надо, вешеприведённая TEST_PROGA.COM весит всего 17 байт (17 символов в исходнике). 300h — это уже 768 символов, ..целый материк, свобода мысли.

Достаточно перехватить управление в коде, перевести его на себя и замутить чё-нить. Объясню «в двух словах»: как это делается! ..Пишется прога на асме (желаемого характера), которая привычным движением руки вставляется в WinHex — в начало, середину, или «конец» EXE-файла жертвы. Желательно, конечно, в начало. после «PE»-заговка. Самый оптимальный вариант — после перечисления DLL-лок (инклудов). Там как-раз достаточно места, и быстрее примем управление. Фрагмент внедрения в CHKDSK.EXE нашей «Бацилы»:

Если Вы запустите такой инфицированный CHKDSK.EXE, то сначала отработает наш код, а только потом запустится сам chkdsk. . но не всё так просто. Там есть своя «Техника внедрения». Дизассемблируется chkdsk.exe, и в листинге ищется команда JMP (переход на метку). Перехватываем этот JMP и после исполнения основного кода «бацилы» передаём управление обратно на эту метку, командой RET ассемблера в коде нашей программы.

В качестве бонуса, вешаю в скрепке пару примеров программ на ассемблере.

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#29 19-01-2011 12:49:58

Re: . Введение в Ассемблер

Что нужно знать о прерываниях

Как уже отмечалось, прерывания бывают двух типов — DOS и BIOS. Но что они из себя представляют. Попробуем ответить на этот вопрос.

Прерывания — это вовсе не прерывания, а готовые программы (процедуры), которые компьютер вызывает для выполнения определенной задачи. Внутри этих «программ-прерываний» имеются вложенные подпрограммы, каждая из которых выполняет определённую задачу. Эти подпрограммы вызываются векторами прерываний!

Программа-прерывание вызывается по номеру (к примеру INT 13H, дисковый ввод/вывод BIOS), где в качестве «параметра» заносится её вектор, т.е. подпрограмма. Например, для вывода информации на экран, нам нужно воспользоваться сервисом-DOS и запросить прерывание с номером INT 21H. Подпрограмму 02H необходимо указать в регистре AH:

При включении компьютера, BIOS выстраивает таблицу векторов прерывания в первых 1024 байтах памяти. Этот килобайт памяти начинается с адреса 0000:0000 и заканчивается 0000:0400 (1024d = 0400h). Откроем в WinHex память, и взглянем на эту таблицу:

Каждый вектор имеет длину 4 байта. Вектор для прерывания 0 начинается с ячейки 0000:0000, прерывания 1 — с 0000:0004, 2 — с 0000:0008, 3 — с 0000:000C и т.д.

Если посмотреть на четыре байта, начиная с адреса 0000:0020, в которых содержится вектор прерывания 8H (прерывание времени суток), то Вы обнаружите там A5FE00F0. Имея ввиду, что младший байт слова расположен сначала, это 4-байтное значение переводится в F000:FEA5. Это стартовый адрес программы ПЗУ, выполняющей прерывание 8H.

Если размер таблицы 1024 байт, а один вектор имеет длинну 4 байта, то выходит чтобы найти общее кол-во векторов нужно 1024/4. . получаем 256. Таким образом, в общем пространстве имеется место для 256 векторов (подпрограмм), которые «разбиваются» по всем номерам прерываний BIOS и DOS. В каждом прерывании может находиться до 20 подпрограмм.

Прерывания с номерами до INT 20H обслуживает BIOS. Номера прерываний DOS лежат в пределах от 20 до 32H:

Прерывания BIOS (без подфункций) Прерывания DOS (без подфункций)

00h: Деление на ноль. 20h: Завершить программу
01h: Пошаговое. 21h: Сервис DOS
02h: Немаскируемое. 25/26h: Абсолютные чтение/запись диска
03h: Точка прерыв. 27h: Завершиться, но остаться резидентным
04h: Переполнение. 28h: Квант времени DOS (НЕТ В ДОКУМЕНТАЦИИ)
05h: Печать экрана. 2eh: Выполнить команду DOS (НЕТ В ДОКУМЕНТАЦИИ)
06h: (резерв) 2fh: Мультиплексное прерывание (спулинг печати)
07h: (резерв) 22h: Адрес завершения
08h: Таймер. 23h: Адрес Control-Break
09h: Клавиатура. 24h: Адрес обработчика критических ошибок
0Ah-0dh: (hdwr ints)
0Eh: Дискета.
0Fh: (hdwr int)
10h: Видео сервис.
11h: Список оборудования.
12h: Размер исп.памяти.
13h: Дисковый в/в.
14h: В/в последовательный порт
15h: Расшир.сервис AT.
16h: В/в клавиатуры.
17h: В/в принтера.
18h: ROM-BASIC.
19h: Загрузка.
1Ah: В/в таймера.
1Bh: Прерывание клавиатуры.
1Ch: Прерывание по таймеру
1Dh: Видео параметры
1Eh: Параметры дискет
1Fh: Символы графики

Приведу краткое описание прерывания-BIOS INT 13H:

INT 13H: дисковый ввод-вывод
Этот сервис предоставляет прямой доступ к адаптерам дискеты и жёсткого диска. Рекомендуется там, где это возможно, использовать INT 25H и INT 26H, чтобы предоставить драйверам устройств-DOS выполнять всю низкоуровневую обработку. Разумеется, для таких операций, как форматирование диска или установка защиты от копирования, прерывание INT 13H может оказаться единственной альтернативой.

подфункции: 00H сброс контроллера 08H дать парам диска 10H проверить готовность
01H дать статус 09H иниц табл парам 11H рекалибрация
02H читать секторы 0aH длинное чтение 14H диагностика
03H писать секторы 0bH длинная запись 15H дать тип диска
04H верификация 0cH искать цилиндр 16H изменить статус
05H форматир дорожку 0dH альтерн сброс 17H уст тип диска

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#30 20-01-2011 13:39:20

Re: . Введение в Ассемблер

Использование сервисов DOS. Прерывание INT 21H.

После загрузки MS-DOS в память, операционная система предоставляет нам свои услуги, в виде прерывания INT 21H (сервисы DOS). Используя это прерывание в своих программах мы можем выполнять около 80-ти операций. Не буду перечислять все функции этого прерывания, остановлюсь только на наиболее значимых:

00H: завершить программу 27H: читать блок произвольного файла
01H: ввод с клавиатуры 28H: писать блок произвольного файла
02H: вывод на дисплей 2aH: дать дату DOS
05H: вывод на принтер 2cH: дать время DOS
09H: Выдать строку 2fH: дать текущий DTA
0dH: Сбросить диск 30H: дать номер версии DOS
0eH: Выбрать умалчиваемый диск DOS 31H: завершиться и остаться резидентным — KEEP
0fH: открыть файл через FCB 32H: дать дисковую информацию DOS
10H: Закрыть файл через FCB 35H: дать вектор прерывания
13H: Удалить файл через FCB 36H: дать свободную память диска
14H: читать файл через FCB 39H: создать новое оглавление — MKDIR
15H: писать файл через FCB 40H: Писать в файл через описатель
16H: создать файл через FCB 48H: дать размер памяти
17H: Переименовать файл через FCB 56H: Переименовать/переместить файл
25H: установить вектор прерывания 5bH: создать новый файл

Функция 09H прерывания INT 21H (вывод строки символов на экран).

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

Как уже говорилось, при вызове прерывания необходимо указать значение функции в регистре AH (в нашем случае — 09H). Далее, вводятся инструкции и вызывается само прерывание. Регистр DX должен указывать на первый символ строки (т.е. расположение текстовой строки). В конце строки обязательно должен присутствовать символ «$». Это означает, что сам символ «$» не может входить в строку. Сама строка может быть любой длины.

Чтоб перевести текст на следующую строку, в конце указываются спец-символы 0AH (перевод строки), и 0DH (возврат каретки). Без них — текст будет располагаться в одну строчку.

. пришло время скачать инструментарий, чтоб проводить эксперементы. Программы, целиком написанные на ассемблере, транслируются в машинный код при помощи ассемблера. Под DOS-ом большой популярностью пользуется пакет TASM, для винды — MASM от Microsoft. С ним конкурирует FASM, поддерживающий более естественный синтаксис. Его и качаем с сайта WASM.RU. Он отличается от предшественников тем, что это и транслятор и компилятор в одном флаконе. Вводиш в окне инструкции, жмёш F9 и на выходе получаеш готовый исполняемый файл! Очень удобно. особенно для начинающих!

. значит скачали FASM 1.67, и в поле набиваем текстовые строки нашей программы. Вот пример:

Программа, приветствующая WHATIS из досовского окна.

use16 ; DOS работает в 16-тиразрядном режиме
org 100h ; Делаем СОМ-файл с начальным смещением 100h

mov AH,09h ; Суём в регистр AH функцию 09h прерывания 21h
mov dx,text ; В регистре DX указываем от куда брать строку
int 21h ; Вызываем прерывание 21h
ret ; Возвращаемся туда, от куда были вызваны

; Текстовая строка (адрес для регистра DX)
text db ‘Hello, WHATIS. $’

. если нужно вывести несколько строк, то можно сделать так:

. на выходе — СОМ-файл размером 63 байт. Таким способом можно выводить текстовые строки из памяти, которые содержат информацию об оборудовании, объёме свободной памяти и т.д. и т.п.

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

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#31 21-01-2011 12:22:44

Re: . Введение в Ассемблер

Определение Стека

Стек — это такое место хранения данных, которые при надобности можно обратно восстановить. В нём хранятся адреса переходов, различные данные и т.д. Регистр SP указывает на адрес вершины стека. Регистр ВР содержит адрес, начиная с которого в стек вносится или забирается информация.

Представьте, что одна подпрограмма вызывает другую. Вызываемая подпрограмма завершила свое выполнение, теперь ей надо передать управление подпрограмме, которая её вызвала. Как-раз адрес следующей команды (после вызова подпрограммы) находится на верхушке стека, в регистре SP.

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

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

В стек можно заносить не только адреса, но и данные, текстовые строки и т.п. Команда ассемблера PUSH помещает данные в стек, а команда POP снимает их от туда. При использовании стека наша программа «Hello, Whatis. » примет следующий вид:

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

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#32 24-01-2011 12:34:02

Re: . Введение в Ассемблер

Память 16-тиразрядных систем (DOS).

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

В DOS — память сегментная. Вся память делится на сегменты по 64К, и адрес задаётся форматом «сегмент:офсет». Сегмент — задаёт порядковый номер сегмента, а офсет — смещение в этом сегменте. Это объяснение для 16-тиразрядных программ (32-хразрядные обсудим позже).

На рис. общая память, разделённая на сегменты по 64kb. Здесь — максимум 65536 сегментов:

;; 16 двоичных разрядов — это 1111 1111 1111 1111, или 65535d (FFFFh).
;; 65535 * 64Кб = 4 194 240Кб (или 4096Мб, или 4Гб памяти).

С помощью 16 бит можно адресовать только 65536 байт памяти и 65536 сегментов. Например, 0000:4012 это означает: сегмент 0, смещение 4012. Чтобы узнать, что находится в том адресе, вы сначала переходите на сегмент 0, а затем в сегменте смещаетесь на 4012.

Память 32-хразрядных систем (WIN-32).

В 32-хразрядном Windows (95 и выше) Вы всё еще имеете сегменты, но вам не нужно заботиться о них, потому, что они уже не 64kb (как в 16-разрядном), а 4 Гб. Это называеся плоской моделью памяти (flat). Здесь есть только смещения и они теперь 32-разрядные (в диапазоне от 0 до 4 294 967 295). Каждая ячейка в памяти указывается смещением.

Но 4ГБ может и не быть на машине, поэтому эта память называется виртуальной. Мало того, каждый процесс выполняется в своём виртуальном адресном пространстве, . а это значит, что никакой другой процесс не сможет получить доступ к вашей памяти. Для этого существуют специальные API функции.

Память 0-0000FFFF не используется и служит для выявления нулевых указателей, значит, если вы укажете адрес 0000С567, то он будет считаться нулевым. Любая попытка обратится к этой памяти приводит к ошибке. Память выше 80000000 одна для всех процессов. В этой памяти находится код нулевого кольца, структуры ядра, код планировщика задач, код драйверов, диспетчер ввода вывода, таблица прерываний и т.д. Любая попытка обратиться к памяти ядра приводит к ошибке и к немедленному завершению приложения.

Память в диапазоне 00001000-7FFFFFFF доступна для 3 кольца (т.е. для вашего приложения). С ней Вы, что хотите то и делаете, в неё также грузятся DLL-ки.

Если Вам даётся 2ГБ памяти, то это не означает, что вы можете обратиться к любому участку памяти. Для того чтобы получить доступ к некоторому участку памяти надо сначала её зарезервировать. Минимальный размер выделяемой памяти — страница, равна 1000h байтам (1000h байт = 4096d байт, или 4КБ). Даже если вы захотите выделить 5 байт, то всё равно выделится 4КБ. Думаю, вы не столкнётесь с тем, что вам надо будет выделять память. Это нужно при работе с файлами для того, что бы в эту память читать файл.

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

DOS Fn 33H: установить/опросить статус Ctrl-Break

Читайте также:

  1. Административно правовой статус иностранцев в РФ
  2. АДМИНИСТРАТИВНО-ПРАВОВОЙ СТАТУС (АПС) ГРАЖДАНИНА
  3. Административно-правовой статус беженцев и вынужденных переселенцев
  4. Административно-правовой статус благотворительных организаций 16 страница
  5. Административно-правовой статус благотворительных организаций 17 страница
  6. Административно-правовой статус благотворительных организаций 18 страница
  7. Административно-правовой статус благотворительных организаций 19 страница
  8. Административно-правовой статус благотворительных организаций 20 страница
  9. Административно-правовой статус благотворительных организаций 21 страница
  10. Административно-правовой статус благотворительных организаций 22 страница
  11. Административно-правовой статус благотворительных организаций 23 страница

Выход

Вход

DOS Fn 32H: дать информацию DOS о диске

Выход

Вход

DOS Fn 31H: завершиться и остаться резидентным — KEEP

Выход

Вход

DOS Fn 30H: дать номер версии DOS

Выход

Вход

DOS Fn 2fH: дать адрес текущей DTA

Выход

Вход

DOS Fn 2eH: установить/сбросить переключатель верификации

Выход

Вход

DOS Fn 2dH: установить время DOS

DOS Fn 2cH: дать время DOS

CH = часы (0 до 23)

CL = минуты (0 до 59)

DH = секунды (0 до 59)

DL = сотые доли секунды (0 до 99)

возвращает текущее время, как оно известно системе.

Поскольку системные часы имеют частоту 18.2 тиков в секунду (интервал 55мс), DL имеет точность 0.04 сек.

  • AH = 2dH
  • CH = часы (0 до 23)
  • CL = минуты (0 до 59)
  • DH = секунды (0 до 59)
  • DL = сотые доли секунды (0 до 99)
  • AL = 0 если время корректно

Описание:

устанавливает системное время DOS.

  • AH = 2eH
  • AL = 0 отключить верификацию
  • = 1 включить верификацию
  • нет =

Описание:

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

  • AH = 2fH
  • ES:BX = адрес начала текущей DTA

Описание:

возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться сохранить адрес DTA, а впоследствии восстановить его посредством функции 1aH «Уст. DTA».

Замечание:

Эта функция изменяет сегментный регистр ES.

  • AH = 30H
  • AL = старший номер версии
  • AH = младший номер версии
  • BX,CX = 0000H DOS 3.0+

Описание:

возвращает в AX значение текущего номера версии DOS. например, для DOS 3.2, в AL возвращается 3, в AH — 2.

Замечание:

если в AL возвращается 0, можно предполагать, что работает DOS более ранней версии, чем DOS 2.0.

Версии:

DOS 2.x не гарантирует очистки регистров CX и BX.

  • AH = 31H
  • AL = код выхода
  • DX = объем памяти, оставляемой резидентной, в параграфах
  • нет = (неприменим)

Описание:

выходит в родительский процесс, сохраняя код выхода в AL. код выхода можно получить через функцию 4dH Wait. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт = DX * 16). Эта функция перекрывает функцию INT 27H, которая не возвращает код выхода и неспособна установить резидентную программу, большую 64K.

Описание:

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

Предупреждение:

изменяет сегментный регистр DS. Эта недокументированная функция может измениться в будущих версиях.

Дата добавления: 2014-01-20 ; Просмотров: 374 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Функции dos int 27h: завершиться, но остаться резидентным

Плохо смотрел значит, там все что нужно есть, даже больше чем тебе сейчас нужно знать

═══════════════════════════════════ ════════════════════╡ Функции DOS │
DOS Fn 00H: Завершить программу
DOS Fn 01H: Ввод с клавиатуры
DOS Fn 02H: Вывод на дисплей
DOS Fn 03H: Ввод AUX
DOS Fn 04H: Вывод AUX
DOS Fn 05H: Вывод на принтер
DOS Fn 06H: Обмен с консолью
DOS Fn 07H: Нефильтрующий консольный ввод без эха
DOS Fn 08H: Консольный ввод без эха
DOS Fn 09H: Выдать строку
DOS Fn 0aH: Буферизованный ввод строки
DOS Fn 0bH: Проверить статус ввода
DOS Fn 0cH: Ввод с очисткой
DOS Fn 0dH: Сбросить диск
DOS Fn 0eH: Выбрать умалчиваемый диск DOS
DOS Fn 0fH: Открыть файл через FCB
DOS Fn 10H: Закрыть файл через FCB
DOS Fn 11H: Найти 1-й совпадающий файл через FCB
DOS Fn 12H: Найти следующий совпадающий файл через FCB
DOS Fn 13H: Удалить файл через FCB
DOS Fn 14H: Читать последовательный файл через FCB
DOS Fn 15H: Писать последовательный файл через FCB
DOS Fn 16H: Создать файл через FCB
DOS Fn 17H: Переименовать файл через FCB
DOS Fn 19H: Дать умалчиваемый диск DOS
DOS Fn 1aH: Установить адрес DTA
DOS Fn 1bH: Дать информацию FAT (текущий диск)
DOS Fn 1cH: Дать информацию FAT (любой диск)
DOS Fn 21H: Читать запись произвольного файла
DOS Fn 22H: Писать запись произвольного файла
DOS Fn 23H: Дать размер файла через FCB
DOS Fn 24H: Установить адрес блока произвольного файла
DOS Fn 25H: Установить вектор прерывания
DOS Fn 26H: Создать префикс программного сегмента
DOS Fn 27H: Читать блок произвольного файла
DOS Fn 28H: Писать блок произвольного файла
DOS Fn 29H: Разобрать имя файла
DOS Fn 2aH: Дать дату DOS
DOS Fn 2bH: Установить дату DOS
DOS Fn 2cH: Дать время DOS
DOS Fn 2dH: Установить время DOS
DOS Fn 2eH: Установить/сбросить переключатель верификации
DOS Fn 2fH: Дать текущий DTA
DOS Fn 30H: Дать номер версии DOS
DOS Fn 31H: Завершиться и остаться резидентным — KEEP
DOS Fn 32H: Дать дисковую информацию DOS (недокументировано)
DOS Fn 33H: Установить/опросить уровень контроля прерывания DOS
DOS Fn 34H: Адрес статуса реентерабельности DOS
DOS Fn 35H: Дать вектор прерывания
DOS Fn 36H: Дать свободную память диска
DOS Fn 37H: Установить/опросить символ-переключатель (недокументировано)
DOS Fn 38H: Дать/Установить информацию страны
DOS Fn 39H: Создать новое оглавление — MKDIR
DOS Fn 3aH: Удалить оглавление — RMDIR
DOS Fn 3bH: Установить умалчиваемое оглавление DOS — CHDIR
DOS Fn 3cH: Создать описатель файла
DOS Fn 3dH: Открыть описатель файла
DOS Fn 3eH: Закрыть описатель файла
DOS Fn 3fH: Читать файл через описатель
DOS Fn 40H: Писать в файл через описатель
DOS Fn 41H: Удалить файл
DOS Fn 42H: Установить указатель файла — LSEEK
DOS Fn 43H: Установить/опросить атрибут файла — CHMOD
DOS Fn 44H: Управление вводом-выводом устройства — IOCTL
DOS Fn 45H: Дублировать описатель файла — DUP
DOS Fn 46H: Переназначить описатель — FORCDUP
DOS Fn 47H: Дать умалчиваемое оглавление DOS
DOS Fn 48H: Распределить память (дать размер памяти)
DOS Fn 49H: Освободить блок распределенной памяти
DOS Fn 4aH: Сжать или расширить блок памяти
DOS Fn 4bH: Выполнить или загрузить программу — EXEC
DOS Fn 4cH: Завершить программу — EXIT
DOS Fn 4dH: Дать код выхода программы — WAIT
DOS Fn 4eH: Найти 1-й совпадающий файл
DOS Fn 4fH: Найти следующий совпадающий файл
DOS Fn 54H: Дать переключатель верификации DOS
DOS Fn 56H: Переименовать/переместить файл
DOS Fn 57H: Установить/опросить время/дату файла
DOS Fn 59H: Дать расширенную информацию об ошибке
DOS Fn 5aH: Создать уникальный временный файл
DOS Fn 5bH: Создать новый файл
DOS Fn 5cH: Блокировать/разблокировать доступ к файлу
DOS Fn 5eH: Различные сетевые функции
DOS Fn 5fH: Переназначение устройств в сети
DOS Fn 62H: Дать адрес префикса программного сегмента
═══════════════════════════════════ ════════════════════╡ Прерывания DOS
INT 20H: Завершить программу
INT 21H: Функции DOS
INT 22H: Адрес завершения
INT 23H: Адрес выхода по Ctrl-Break
INT 24H: Обработчик критических ошибок
INT 25H/26H: Прямые дисковые чтение/запись
INT 27H: Завершиться и остаться резидентным
INT 28H: Квант времени DOS (недокументировано)
INT 2eH: Выполнить команду DOS (недокументировано)
INT 2fH: Мультиплексное прерывание

Функции dos int 27h: завершиться, но остаться резидентным

Приложение Б
Функции DOS (INT 21 h)

DOS, функция OOh
Завершить программу

AH=OOh
CS — сегмент PSP завершающегося процесса

Передает управление на вектор завершения в PSP (выходит в родитель-
ский процесс). Идентична функции INT 20h (Terminate). Регистр CS
должен указывать на PSP. Восстанавливает векторы прерываний DOS
22h-24h (Завершение, Ctrl-Break и Критическая ошибка), устанавливая
значения, сохраненные в родительском PSP. Выполняет сброс файло-
вых буферов. Файлы должны быть предварительно закрыты, если их
длина изменилась.

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

из программы лучше использовать функцию DOS 4Ch.

DOS, функция 01h
Считать со стандартного устройства ввода

AL — символ, полученный из стандартного ввода

Считывает (ожидает) символ со стандартного входного устройства.
Отображает этот символ на стандартное выходное устройство (эхо).
При обнаружении Ctrl-Break выполняется INT 23h.

Ввод расширенных клавиш ASCII (F1-F12, PgUp, курсор и другие) тре-
бует двух обращений к этой функции. Первый вызов возвращает AL=0.
Второй вызов возвращает в AL расширенный код ASCII.

DOS, функция 02h
Записать в стандартное устройство вывода

AH=02h
DL — символ, выводимый в стандартный вывод

Посылает символ из DL в стандартное устройство вывода. Обрабатыва-
ет символ Backspace (ASCII 8), перемещая курсор влево на одну пози-
цию и оставляя его в новой позиции. При обнаружении Ctrl-Break вы-
полняется INT 23h.

Считать символа со стандартного вспомогательного

AL — символ, введенный со стандартного вспомогательного устройства

Считывает (ожидает) символ со стандартного вспомогательного устрой-
ства, СОМ1 или AUX и возвращает этот символ в AL.

Ввод не буферизуется и должен опрашиваться (не управляется преры-
ваниями). При запуске DOS порт AUX (COM1) инициализируется так:

2400 бод, без проверки на четность, 1 стоп-бит, 8-битные слова. Коман-
да DOS MODE используется для установки иных характеристик.

DOS, функция 04h
Записать символ в стандартное вспомогательное устройство

AH^h
DL — символ, выводимый в стандартное вспомогательное устройство

Посылает символ, находящийся в регистре DL, на стандартное вспомо-
гательное устройство, COM1 или AUX.

DOS, функция 05h
Вывести на принтер

АН-ОЗЬ
DL — символ, записываемый на стандартный принтер

Посылает символ в DL на стандартное устройство печати, обычно

DOS, функция 06h
Консольный ввод-вывод

DL=OOh-FEh — символ, посылаемый на стандартный вывод

DL=FFh — запрос ввода со стандартного ввода

ZF=0, если осуществлялся ввод символа и символ готов при запросе ввода

AL — считанный символ
ZF=1, если осуществлялся ввод символа и символа в консоли нет

При DL°=OFFh выполняет ввод с консоли «Без ожидания», возвращая
включенный флаг нуля ZF, если на консоли нет готового символа. Если
символ готов, сбрасывает флаг ZF и возвращает считанный символ в AL.
Если DL не равен OFFh, то DL направляется на стандартный вывод.

DOS, функция 07h
Нефильтрующий консольный ввод без эха

AL — символ, полученный через стандартный ввод

Считывает (ожидает) символ со стандартного входного устройства
и возвращает этот символ в AL. Не проверяет на Ctrl-Break, Backspace
и другие.

Для ввода расширенного символа ASCII должна быть вызвана дважды.
Для проверки статуса используется функция DOS OBh (чтобы не ожи-
дать нажатия клавиши).

DOS, функция 08h
Консольный ввод без эха

AL — символ, полученный через стандартный ввод

Считывает (ожидает) символ со стандартного входного устройства
и возвращает этот символ в AL. При обнаружении Ctrl-Break выполня-
ется прерывание INT 23h.

Примечание.
Для ввода расширенного символа ASCII должна быть вызвана дважды.

DOS, функция 09h
Запись строки на стандартный вывод

АН-09Н
DS:DX — адрес строки, заканчивающейся символом «$» (ASCII 24h)

Строка, исключая завершающий ее символ «$», посылается на стандар-
тный вывод. Символы Backspace обрабатываются как в функции 02h
(вывод на дисплей). Чтобы перейти на новую строку, обычно включают
в текст пару CR/LF (ASCII ODh и ASCII OAh). Строки, содержащие
«$», можно передать на стандартное устройство вывода с помощью фун-
кции 40h (ВХ-0).

DOS, функция OAh
Ввод строки в буфер

AH-OAh
DS:DX — адрес входного буфера (Таблица Б-1)

Таблица Б-1. Формат входного буфера.

Буфер содержит введенные данные, в конце — символ CR (ASCII ODh)

DOS, функция OBh
Проверка статуса ввода

AL=FFh, если символ доступен со стандартного ввода
AL=OOh, если нет доступного символа

Проверяет состояние стандартного ввода. При распознавании Ctrl-Break

выполняется INT 23h.

Используется перед функциями Olh, 07h и 08h, чтобы избежать ожида-
ния нажатия клавиши.

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

DOS, функция OCh
Ввод с очисткой

AL — номер функции ввода DOS:

AL=01h — ввод с клавиатуры
AL=06h — ввод с консоли
AL=°07h — нефильтрующий без эха

AL=08h — ввод без эха
AL=OAh — буферизованный ввод

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

DOS, функция ODh
Сброс диска

Сбрасывает диск (записывает на диск все файловые буферы). Файл,
размер которого изменился, должен быть предварительно закрыт (при
помощи функций 10h или 3Eh).

DOS, функция OEh
Установить текущий диск DOS

DL — номер диска (0 — А, 1 — В и так далее), который становится теку-
щим

AL — общее число дисководов в системе

Диск, указанный в DL, становится текущим. Проверка: используется
функция 19h (дать текущий диск). В регистре AL возвращается число
дисководов всех типов, включая жесткие диски и «логические» диски
(как диск В: системе с одним гибким диском).

AL имеет то же значение, что и LASTDRIVE, указанное в файле

CONFIG.SYS, и по умолчанию равно 5.

DOS, функция OFh
Открыть файл через FCB

AH-OFh
DS:DX — адрес неоткрытого FCB (Таблица Б-2)

AL=OOh, если функция выполнена успешно (FCB заполнен)
AL=FFh, если файл не найден или доступ к файлу не разрешен

Файл, описываемый неоткрытым FCB, должен существовать в текущем
оглавлении на диске, специфицированном в FCB (0 — текущий, 1 — А,
2 — В и так далее). Если файл не существует, возвращается AL=OFFh.
Файл открывается в режиме совместимости. Если поле «Номер диска»
в FCB равно нулю в момент вызова, то оно заполняется номером теку-
щего дисковода (1 -А,2-Ви так далее). Поле FCB «Номер текущего
блока» устанавливается в ноль. Поле FCB «Размер логической записи»
устанавливается в 80h. Поля даты и размера файла в FCB устанавлива-
ются из оглавления.

DOS, функция 10h
Закрыть файл через FCB

AH=10h
DS:DX — адрес открытого FCB (Таблица Б-2)

Таблица Б-2. Формат FCB.

Смещ. Размер Описание
-07h байт Расширенный FCB, если FFh
-06h 5 байт Зарезервировано
-Olh байт Атрибут файла, если расширенный FCB
+00h байт Номер диска (0 — текущий, 1 — А. )
+01h 8 байт Имя файла
+09h 3 байта Расширение файла
+OCh слово Номер текущего блока
+OEh слово Размер логической записи
+10h двойное слово Размер файла
+14h слово Дата последней записи
+16h слово Время последней записи
+18h 8 байт Зарезервировано
+20h байт Запись с текущего блока
+21h двойное слово Номер записи при непосредственном доступе к файлу

AL=OOh, если функция выполнена успешно

AL=FFh, если файл не найден там, где он находился при открытии

с помощью функции OFh

Закрывает файл, открытый функцией OFh. Файл должен находиться на
своем первоначальном месте в текущем оглавлении диска, на котором
он был открыт. Если файл найден, оглавление обновляется, файловые
буфера сбрасываются и возвращается AL=OOh. Если файл не найден,
оглавление не обновляется и возвращается AL=FFh.

DOS, функция 11h
Найти первый совпадающий файл через FCB

AH=llh
DS:DX — адрес неоткрытого FCB (Таблица Б-2)

AL°OOh, если подходящее имя найдено

DTA заполнен
AL=FFh, если подходящего имени нет

В текущем оглавлении DOS происходит поиск файлов с именем, соот-
ветствующим заданному шаблону. При неудаче возвращается
AL=OFFh. Если имя найдено, AL очищается, в первый байт DTA поме-
щается номер дисковода (А — 1, В — 2 и так далее), а в следующие
32 байта помещается элемент оглавления для найденного файла.

Можно использовать при вызове расширенный FCB, чтобы выбирать
файлы с указанными атрибутами. В этом случае в DTA помещаются:

байт FFh, 7 байт нулей, номер диска и элемент оглавления. ,

DOS, функция 12h
Найти следующий совпадающий файл через FCB

АН-12h
DS:DX — адрес неоткрытого FCB (Таблица Б-2)

AL=OOh, если подходящее имя найдено

DTA заполнен
AL=FFh, если подходящего имени нет

Используется после вызова функции llh (Найти первый совпадающий
файл через FCB) с обобщенным именем файла. Каждый последующий
вызов заполняет DTA очередным подходящим элементом оглавления
и возвращает AL=OOh. Если подходящих имен больше нет, возвращает-
ся AL=FFh.

Резервируемая область в FCB сохраняет информацию, необходимую
для продолжения поиска. Поэтому не стоит открывать и изменять FCB
между вызовами.

DOS, функция 13h
Удалить файл через FCB

AH=13h
DS:DX — адрес неоткрытого FCB (Таблица Б-2)

AL=OOh, если функция выполнена успешно
AL=FFh, если файл не найден или доступ к файлу не разрешен

Эта функция удаляет все подходящие файлы в текущем оглавлении
указанного диска согласно спецификации в FCB. Если подходящие
файлы не найдены или если доступ отвергнут (как при попытке уда-
лить файл с атрибутом Read-Only), функция возвращает в регистре AL
значение FFh.

DOS, функция 14h
Последовательное чтение из файла через FCB

AH°14h
DS:DX — адрес открытого FCB (Таблица Б-2)

AL=OOh, если чтение было успешным и DTA содержит данные

AL=01h, если достигнут конец файла (EOF) и данные не считаны
AL=02h, если произошел выход за сегмент (чтения не было)
AL=03h, если EOF и считана усеченная запись (дополнена нулями)

Функция читает файл, специфицированный в FCB. Затем соответствен-
но увеличивает значения полей в FCB.

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

DOS, функция 15h
Последовательная запись в файл через FCB

AH°15h
DS:DX — адрес открытого FCB (Таблица Б-2)

AL=OOh, если запись была успешной

AL=01h, если ошибка переполнения диска (данные не записаны)

AL=02h, если произошел выход за сегмент (записи не было)

Функция записывает файл, специфицированный в FCB. Затем соответ-
ственно увеличивает значения полей в FCB.

Перед началом последовательной обработки файла нужно сбрасывать
«Номер текщей записи» в ноль, так как функция OFh не инициализиру-
ет это поле.

Примечание.
DOS буферизует данные, записывая полный сектор за один раз.

DOS, функция 16h
Создание файла через FCB

АН-16h
DS:DX — адрес неоткрытого FCB (Таблица Б-2)

AL=OOh, если функция выполнена успешно

FCB заполнен
AL=FFh, если при выполнении функции возникли ошибки

Файл, специфицированный неоткрытым FCB, создается на диске, ука-
занном в FCB (0 — текущий, 1 — А и так далее). Он открывается в те-
кущем оглавлении этого диска. FCB заполняется аналогично функции
OFh. Если файл существует в момент вызова, его элемент оглавления
перекрывается новым файлом, а длина файла сбрасывается в ноль.

Примечание.
Handle-ориентированные функции DOS 2.0+ гораздо удобнее в работе.

DOS, функция 17h
Переименовать файл через FCB

AH-17h
DS:DX — адрес измененного FCB (Таблица Б-2)

AL=OOh, если функция выполнена успешно
AL=FFh, если при выполнении функции возникли ошибки

Описание.
Переименовывает файл в текущем оглавлении.

DOS, функция 19h i
Получить текущий диск DOS

AL — номер текущего диска (0 — А, 1 — В, и так далее)

Описание.
Возвращает номер дисковода текущего диска DOS.

DOS, функция 1Ah
Установить адрес DTA

AH=lAh
DS:DX — адрес DTA

Устанавливает адрес DTA. Все FCB-ориентированные операции работа-
ют с DTA. DOS не позволяет операциям ввода/вывода пересекать гра-
ницу сегмента. Функции поиска llh, 12h, 4Eh и 4Fh помещают данные
в DTA. DTA глобальна, поэтому надо проявлять осторожность при на-
значении ее в рекурсивной процедуре. При запуске программы ее DTA
устанавливается по смещению 80h относительно PSP.

DOS, функция 1Bh
Получить информацию FAT для текущего диска

DS:BX — адрес байта FAT ID, отражающего тип диска (Таблица Б-3)
DX — всего кластеров (единиц распределения) на диске
AL — секторов на кластер
СХ — байт на сектор

Таблица Б-3. Значения ID.

ID Описание
FFh Floppy, 2 стороны, 8 секторов на дорожку (320Кбайт)
FEh Floppy, 1 сторона, 8 секторов на дорожку (160Кбайт)
FDh Floppy, 2 стороны, 9 секторов на дорожку (360Кбайт)
FCh Floppy, 1 сторона, 9 секторов на дорожку (180Кбайт)
F9h Floppy, 2 стороны, 15 секторов на дорожку (1,2Мбайт)
F8h Жесткий диск
FOh Другой

Возвращает информацию о размере и типе текущего диска. Размер дис-
ка (в байтах) равен DX*AL*CX. Свободную память можно найти функ-
циями 36h или 32h.

DOS l.x держит FAT в памяти и возвращает DS:BX => FAT.
DOS 2.0+ может держать в памяти лишь часть всей FAT.

Примечание.
Эта функция изменяет содержимое регистра DS.

DOS, функция 1Ch
Получить информацию FAT для указанного диска

АН-1Ch
DL — номер диска (0 — текущий, 1 — А и так далее)

DS:BX — адрес байта FAT ID, отражающего тип диска (приведен в опи-
сании функции IBh)

DX — всего кластеров (единиц распределения)
AL — секторов на кластер
СХ — байт на сектор

Аналогична функции IBh с той разницей, что регистр DL указывает

диск, для которого нужно получить информацию.

DOS, функция 21h ^
Считать произвольную запись файла

AH-21h
DS:DX — адрес открытого FCB (Таблица Б-2)

AL=OOh, если чтение было успешным и DTA заполнена данными
AL°01h, если достигнут конец файла (EOF) и чтения не было
AL=02h, если произошел выход за сегмент (чтения нет)
AL°03h, если встречен EOF и усеченная запись дополнена нулями

Данная функция читает из файла с текущей позиции как с указанной

в полях FCB «Запись с текущей позиции» и «Номер записи при непо-
средственном доступе к файлу».

DOS, функция 22h
Писать произвольную запись файла

AH=22h
DS:DX — адрес открытого FCB (Таблица Б-2)

AL=OOh, если запись была успешной

AL=01h, при переполнении диска

AL=02h, если DTA+FCB выходит за сегмент (нет записи)

Данная функция записывает в файл с текущей позиции как с указанной
в полях FCB «Запись с текущей позиции» и «Номер записи при непо-
средственном доступе к файлу».

DOS, функция 23п
Получить размер файла через FCB

АН^ЗЬ
DS:DX — адрес неоткрытого FCB (Таблица Б-2)

AL=OOh, если функция выполнена успешно
AL=FFh, если при выполнении функции возникли ошибки

Проще определить размер файла при помощи функции 3Dh с последу-
ющим выполнением 42h (при AL=2).

DOS, функция 24h
Установить адрес произвольной записи в файле

AH°24h
DS:DX — адрес открытого FCB (Таблица Б-2)

Устанавливает поле «Номер записи при непосредственном доступе
к файлу» в FCB на файловый адрес, соответствующий значениям полей
«Текущий блок» и «Запись с текущей позиции».

DOS, функция 25h
Установить вектор прерывания

AL — номер прерывания

DS:DX — вектор прерывания — адрес программы обработки прерывания

Устанавливает значение элемента таблицы векторов прерываний для
прерывания с номером AL, равным DS:DX. Это равносильно записи
4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS
знает, что происходит, и гарантирует, что в момент записи прерывания
будут заблокированы.

Примечание.
Восстановить DS (если необходимо) после этого вызова.

DOS, функция 26h
Создать новый PSP

DX — адрес сегмента (параграфа) для нового PSP

CS — сегмент PSP, используемый как шаблон для нового PSP

Устанавливает PSP для порождаемого процесса по адресу DX:0000.
Текущий PSP (lOOh байт, начиная с CS:0) копируется в DX:OOOOh, поле
МетТор соответственно корректируется, векторы Terminate, Ctrl-Break
и Critical Error копируются в PSP из векторов прерываний INT 22h,
INT 23h и INT 24h. После этого можно загрузить программу с диска
и передать ей управление посредством FAR JMP.

Если перехватывается INT 21h, нужно позаботиться о помещении в стек

корректного CS:IP. Еще лучше использовать функцию 4Ch.

Таблица Б-4. Формат PSP.

Смещ. Размер Описание
+00h 2 байта Инструкция INT 20h
+02h слово Сегмент первого байта памяти, выделенной программе
+04h байт Неиспользуемый заполнитель
+05h байт СР/М системный вызов
+06h слово Первый сегмент для СОМ-файла
+08h 2 байта Запоминаются FARJMP 05h
+OAh двойное слово Хранит INT 22h (адрес завершения)
+OEh двойное слово Хранит INT 23h (адрес обработчика Ctrl-Break)
+12h двойное слово Хранит INT 24h (адрес обработчика критической
ошибки)
+16h слово Сегмент родительского PSP
+18h 20 байт Рабочая таблица файлов. Один байт на файл (FFh —
закрыт)
+2Ch слово Сегмент среды окружения для процесса
+2Eh двойное слово SS:SP на входе при последнем вызове
прерывания INT 21 h
+32h слово Количество входов в рабочей таблице файлов
(по умолчанию 20)
+34h двойное слово Указатель на рабочую таблицу файлов
(по умолчанию PSP:0018h)
+38h двойное слово Указатель на предыдущий PSP
+3Ch 4 байта Зарезервировано
+40h 2 байта Версия при возврате на INT 2 lh (AH=30h)
+42h 26 байт Зарезервировано (используется MS Windows и
версиями DOS выше 6.00)
+5Ch 16 байт Первый FCB по умолчанию ‘
+6Ch 16 байт Второй FCB по умолчанию
+7Ch 4 байта Не используются
-i-ent, 1 Ой Й-.Д.Т.

DOS, функция 27h
Читать произвольный блок файла

DS:DX — адрес открытого FCB (Таблица Б-2)

СХ — число считываемых записей

AL=OOh, если чтение успешно и DTA заполнена данными
AL=01h если достигнут конец файла (EOF) и данные не считаны
AL=02h, если при чтении произошел выход за границу сегмента
AL=03h, если EOF и считана усеченная порция (дополнена нулями)
СХ — действительное число считанных записей

Читает несколько записей из файла, начиная с файлового адреса, ука-
занного полем «Номер записи при непосредственном доступе к файлу»
в FCB. Помещает данные в память, начиная с адреса DTA. Соответству-
ющие поля FCB корректируются, чтобы указывать на следующую за-
пись (первую за прочитанными).

DOS, функция 28h
Писать произвольный блок файла

DS:DX — адрес открытого FCB (Таблица Б-2)
СХ — число записываемых блоков (если СХ равен нулю, то размер фай-
ла усекается до указанного в поле FCB «Номер записи при непосред-
стванном доступе к файлу»)

AL=OOh, если запись успешна «1!
AL=01h, при переполнении диска

AL=02h, если при записи произошел выход за границу сегмента
СХ — действительное число сделанных записей ‘

Записывает несколько блоков в файл, начиная с файлового адреса, ука-
занного полем «Номер записи при непосредственном доступе к файлу»
в FCB. Читает данные из памяти, начиная с адреса DTA. Соответству-
ющие поля FCB корректируются, чтобы указывать на следующую за-
пись (первую за прочитанными).

DOS, функция 29h
Разобрать имя файла

DS:SI — адрес исходной текстовой строки для разбора

ES:DI — адрес буфера для результирующего неоткрытого FCB

AL — битовые флаги, указывающие опции разбора (Таблица Б-5).

AL=OOh, если результирующий FCB не содержит обобщенных символов
AL=01h, если результирующий FCB содержит обобщенные символы
AL°FFh, если неверно обозначение диска в имени файла
DS:SI — изменен — указывает на символ сразу вслед за именем файла
ES:DI — не изменен — указывает на неоткрытый FCB

Создает неоткрытый FCB из строки текста или параметра команды.
Текст, начиная с DS:SI, анализируется как имя файла в формате
D.-FILENAME.EXT, и буфер по адресу ES:DI заполняется как соответ-
ственно форматированный FCB.

Таблица Б-5. Битовые флаги.

Бит Описание
Пропустить разделители
1 Использовать присутствующий номер диска, если диск не указан,
вместо того, чтобы устанавливать это поле в ноль ;
2 Использовать в FCB имя присутствующего файла, если базовое имя
не указано, вместо того, чтобы заполнять это поле стандартным •
заполнителем ,
3 Использовать в FCB расширение присутствующего файла, если
расширение не указано, вместо того, чтобы заполнять это поле
стандартным заполнителем
4 Зарезервировано

DOS, функция 2Ah
Получить системную дату

AL — день недели (0 — воскресенье, 1 — понедельник, . 6 — суббота),
DOS 3.0+

СХ — год (от 1980 до 2099)
DH — месяц (1 до 12)
DL — день (1 до 31)

Описание.
Возвращает текущую дату, которая известна системе.

DOS 2.x не гарантирует возврата в AL значения дня.
DOS 1.0+ возвращает правильный день недели.
Версии до 2.1 имеют проблемы с переходом через дату.

DOS, функция 2Bh
Установить системную дату

СХ — год (от 1980 до 2099)
DH — месяц (от 1 до 12)
DL — день (от 1 до 31)

AL=OOh, если дата корректна ,
AL=FFh, если дата некорректна и не изменена

Описание. ,
Устанавливает системную дату DOS.

DOS, функция 2Ch
Получить время DOS

СН — часы (от 0 до 23)
CL — минуты (от 0 до 59)
DH — секунды (от 0 до 59)
DL — сотые доли секунды (от 0 до 99)

Описание.
Возвращает текущее время, которое известно системе.

Поскольку системные часы имеют частоту 18.2 Гц (интервал 55мс),

DL имеет точность примерно 0.04 сек.

DOS, функция 2Dh
Установить время DOS

СН — часы (от 0 до 23)

CL — минуты (от 0 до 59)

DH — секунды (от 0 до 59)

DL — сотые доли секунды (от 0 до 99)

AL=OOh, если время корректно
AL^FFh, если время некорректно и не изменено

Описание.
Устанавливает системное время DOS.

DOS, функция 2Eh
Установить/сбросить переключатель верификации

AL=OOh — отключить верификацию

AL=01h — включить верификацию

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

DOS, функция 2Fh
Получить адрес текущей DTA

ES:BX — адрес начала текущей DTA

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

Примечание.
Эта функция изменяет сегментный регистр ES.

Версии: DOS 2.00 и выше

DOS, функция ЗОИ
Получить номер версии DOS

AL — старший номер версии
АН — младший номер версии

BL:CX — 24-битный серийный номер (большинство версий не поддер-
живают этот параметр)

Возвращает в АХ значение текущего номера версии DOS. Например,
для DOS 3.20 в AL возвращается 03h, в АН — 14h.

Если в AL возвращается OOh, можно предполагать, что работает DOS

более ранней версии, чем DOS 2.0.

Версии: DOS 2.00 и выше.

DOS, функция 31h
Завершиться и остаться резидентным

DX — объем памяти, оставляемой резидентной (в параграфах)

Выходит в родительский процесс, сохраняя код выхода в AL. Код выхо-
да можно получить через функцию 4Dh. DOS устанавливает начальное
распределение памяти, как специфицировано в DX, и возвращает управ-
ление родительскому процессу, оставляя указанную память резидентной
(число байт равно DX*16). Эта функция перекрывает функцию
INT 27h, которая не возвращает код выхода и не способна установить
резидентную программу, размер которой превышает 64Кбайт.

Версии: DOS 2.00 и выше.

DOS, функция 32h
Получить информацию DOS о диске

(Официально не документирована)

AH=32h
DL — номер диска (0 — текущий, 1 — А и так далее)

AL=OOh, если в DL был задан корректный диск

DS:BX — адрес блока информации о диске для запрошенного уст-
ройства (Таблица Б-6)

AL=FFh, если в DL был задан некорректный диск

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

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

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

Версии: DOS 2.00 и выше.

Таблица Б-6. Формат блока информации о диске.

Смещ. Размер Описание
+00h байт Номер диска (0 — текущий, 1 — А и так далее)
+01h байт Количество блоков в драйвере диска
+02h слово Количество байт в секторе
+04h байт Наибольший номер сектора в кластере
+05h байт Счетчик сдвига для конвертации кластера в сектор
+06h слово Количество зарезервированных секторов в начале диска
+08h байт Количество FAT
+09h слово Количество входов в root-директорию
+OBh слово Номер первого сектора, содержащего данные
+ODh слово Максимальный номер кластера
+OFh байт Количество секторов в FAT
+10h слово Номер первого сектора директории
+12h двойное слово Адрес заголовка драйвера устройства
+16h байт ID (отражает тип диска)
+17h байт OOh, если диск доступен и FFh, если нет
+18h двойное слово Указатель на следующий блок информации о диске
Для версий DOS 2.XX
+lCh слово Кластер, содержащий старт текущей директории.
OOOOh — root, FFFFh — не известно
+lEh 64 байта Путь текущей директории для диска в формате ASCIZ
Для версий DOS 3.XX
+lCh слово Кластер, с которого начинается поиск свободного места
при записи некоторого количества секторов на диск
+lEh слово Количество свободных секторов на диске.
FFFFh — не известно

Таблица Б-6. Формат блока информации о диске. <Окончание)

Смещ. Размер Описание
Для версий DOS 4.XX — 6.ХХ
+OFh слово Количество секторов в FAT
+llh слово Номер первого сектора директории
+13h двойное слово Адрес заголовка драйвера устройства
+17h байт ID (отражает тип диска)
+18h байт OOh, если диск доступен, и FFh, если нет
+19h двойное слово Указатель на следующий блок информации о диске
+lDh слово Кластер, с которого начинается поиск свободного кластера
при записи некоторого количества секторов на диск
+lFh слово Количество свободных секторов на диске.
FFFFh — не известно

DOS, функция 33h
Установить/опросить статус Ctrl-Break

AL=OOh — опросить текущий статус контроля Ctrl-Break
AL=01h — установить статус контроля Ctrl-Break
DL — требуемый статус (0 — выключен, 1 — включен)

DL — текущий статус (0 — выключен, 1 — включен)

Если AL=OOh, в DL возвращается текущий статус контроля Ctrl-Break.

Если AL=01h, в DL возвращается новый текущий статус.

Когда статус «включен», DOS при выполнении большинства функций
(исключая 06h и 07h) проверяет, нажаты ли клавиши Ctrl-Break. Если
это обнаружено, выполняется прерывание INT 23h (если оно не пере-
хватывается, то процесс снимается).

При статусе «выключен» DOS проверяет на нажатие Ctrl-Break лишь
при выполнении операций стандартного ввода/вывода, стандартной пе-
чати и стандартного AUX.

Версии: DOS 2.00 и выше.

DOS, функция 34h
Получить адрес флага активности DOS

(Официально не документирована)

ES:BX — адрес флага активности DOS

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

Если ES:[BX] не нулевой, фоновая программа (TSR либо popup)
не должна использовать никаких функций DOS.

Версии: DOS 2.00 и выше.

DOS, функция 35h
Получить вектор прерывания

AH-35h
AL — номер прерывания (OOh до FFh)

ES:BX — адрес обработчика прерывания

Возвращает значение вектора прерывания для INT (AL), то есть загру-
жает в ВХ 0000:[AL*4], а в ES — 0000:[(AL*4)+2].

Примечание.
Эта функция изменяет сегментный регистр ES.

Версии: DOS 2.00 и выше.

DOS, функция 36h
Получить свободную память диска

АН-ЗбЬ
DL — номер диска (0 — текущий, 1 — А и так далее)

AX=FFFFh, если AL содержал неверный номер диска
Если функция выполнена успешно:

AX — число секторов на кластер
ВХ — число доступных кластеров
СХ — байт на сектор
DX — всего кластеров на диске

Возвращает данные, полезные для подсчета общей и доступной диско-
вой памяти. Если в АХ возвращено FFFFh, значит задан неверный
диск. Иначе свободная память (в байтах) составляет (АХ*ВХ*СХ), все-
го памяти (AX*CX*DX) байт.

Версии: DOS 2.00 и выше.

DOS, функция 37h
Установить/опросить символ-переключатель

(Официально не документирована)

AL=OOh — опросить текущий переключатель
AL=01h — установить символ-переключатель
DL — символ-переключатель

AL=OOh, если функция выполнена успешно

DL — текущий символ-переключатель DOS (если при вызове AL=OOh)
AL=FFh, если использована неподдерживаемая подфункция

Устанавливает или опрашивает «Глобальный переключатель» DOS. Пе-
реключатель (SWITCHAR) — это символ, используемый в командной
строке как признак опции. По умолчанию принимается «/» (например,
DIR /w/p), но его можно изменить на «-» (DIR -w-p), если нужно, что-
бы система была больше похожа на UNIX. Общепринято опрашивать
значение SWITCHAR перед разбором области неформатированных па-
раметров в PSP для выделения опций команды.

Эта недокументированная команда может измениться в будущих верси-
ях DOS. He рекомендуется изменять SWITCHAR.

Версии: DOS 2.00 и выше.

DOS, функция 38h
Получить/установить информацию о стране

AH-SSh
Получить информацию:

AL=OOh — получить данные для текущей страны

DS:DX — адрес локального буфера для чтения блока данных страны

(Таблица Б-7)
Установить информацию:

AL=01h-FEh — установить данные для указанной страны

AL=FFh — установить данные для кода страны > 255

ВХ — 16-битный код страны (Таблица Б-8)

CF=0, если функция выполнена успешно

ВХ — код страны
CF=1, если при выполнении функции возникли ошибки

Если DX=FFFFh, то текущий код страны устанавливается равным AL
(если AL=FFh, то код страны устанавливается равным ВХ). Обычно код
страны устанавливается в файле CONFIG.SYS. Если DX

Версии: DOS 2.00 и выше.

DOS, функция 39h
Создать новое оглавление

АН-ЗЭЬ
DS:DX — адрес строки ASCIZ с именем оглавления

Таблица 6-7. Формат блока данных страны.

Смещ. Размер Описание
+00h слово Формат даты:
OOh — USA (месяц дата год)
Olh — Европа (дата месяц год)
02h — Япония (год месяц дата)
+02h 5 байт Текущая строка символов в формате ASCIZ
+07h 2 байта Разделитель тысяч в формате ASCIZ
+09h 2 байта Разделитель целой и дробной части в формате ASCIZ
+OBh 2 байта Разделитель даты в формате ASCIZ
+ODh 2 байта Разделитель времени в формате ASCIZ
+OFh байт Текущий формат:
Бит 2 — текущий символ заменяется десятичной точкой
Бит 1 — количество пробелов между значением и текущим
символом
Бит 0=0 — текущий символ предшествует значению
Бит 0-=1 — текущий символ следует за значением
+10h байт Количество символов в дробной части числа
+llh байт Формат времени:
Бит 0

0 — 12-часовые часы

Бит 0=1 — 24-часовые часы
+12h двойное слово Адрес карты (CALL FAR при AL=кoд символа больше 80h)
+16h 2 байта Список разделителей в формате ASCIZ
+18h 10 байт Зарезервировано

CF=0, если функция выполнена успешно

АХ не сохранен
CF=1, если при выполнении функции возникли ошибки

Если диск и/или корневой путь не указаны, то новое оглавление созда-
ется в текущей директории. Поддиректория создается и связывается

Таблица Б-8. Коды некоторых стран.

Код Страна
OOlh Соединенные Штаты Америки
003h Латинская Америка
007h Россия
OlFh Нидерланды
020h Бельгия
021h Франция
022h Испания
027h Италия
02Ch Великобритания
031h Германия

с существующим деревом. Если флаг CF установлен при возврате,
то АХ содержит код ошибки, и оглавление не создается.

Версии: DOS 2.00 и выше.

DOS, функция 3Ah
Удалить оглавление

АН-ЗАЬ
DS:DX — адрес строки ASCIZ с именем оглавления

CF=0, если функция выполнена успешно

АХ не сохранен
CF=1, если при выполнении функции возникли ошибки

Если диск и/или корневой путь не указаны, принимаются значения по
умолчанию. Поддиректория удаляется из структуры оглавлений. Если
флаг CF установлен при возврате, то АХ содержит код ошибки, и оглав-
ление не удаляется.

Оглавление не должно содержать файлов и поддиректорий, оно не должно
попадать под влияние возможных ограничений DOS (например, не долж-
но быть задействовано в активных командах JOIN или SUBST).

Версии: DOS 2.00 и выше.

DOS, функция 3Bh
Установить текущую директорию

АН-ЗВЬ
DS:DX — адрес строки ASCIZ с именем оглавления

CF=0, если функция выполнена успешно

АХ не сохранен
CF=1, если при выполнении функции возникли ошибки

Если диск и/или корневой путь не указаны, принимаются значения по
умолчанию. Указанная поддиректория становится текущим оглавлени-
ем DOS для этого (или текущего) диска. Если флаг CF установлен при
возврате, то АХ содержит код ошибки, и текущее оглавление для выб-
ранного диска не изменяется.

Версии: DOS 2.00 и выше.

DOS, функция 3Ch
Создать файл через описатель

DS:DX — адрес строки ASCIZ с именем файла

СХ — атрибут файла (атрибуты приведены в описании функции

CF=0, если функция выполнена успешно

АХ — описатель файла
CF=1, если при выполнении функции возникли ошибки

Описание.
Если диск и/или путь не указаны, принимаются значения по умолчанию.

Версии: DOS 2.00 и выше.

DOS, функция 3Dh
Открыть описатель файла

DS:DX — адрес строки ASCIZ с именем файла

AL — режим открытия:

AL=OOh, чтобы открыть для чтения
AL=01h, чтобы открыть для записи
AL=02h, чтобы открыть для чтения и записи

CF=0, если функция выполнена успешно

AX — описатель файла
CF=1, если при выполнении функции возникли ошибки

Файл открывается в выбранном режиме доступа (режиме открытия).
Если диск и/или путь не указаны, принимаются указанные по умолча-
нию. Файл должен существовать. Указатель чтения/записи устанавли-
вается в ноль.

Версии: DOS 2.00 и выше.

DOS, функция 3Eh
Закрыть описатель файла

АН-ЗЕЬ
ВХ — описатель файла

CF=0, если функция выполнилась успешно

АХ не сохранен
CF=1, если при выполнении функции возникли ошибки

ВХ содержит описатель файла (handle), возвращенный при открытии.
Файл, представленный этим описателем, закрывается, его буферы сбра-
сываются и оглавление обновляется корректными размером, временем
и датой. Из-за недостатка описателей файлов (максимум 20, по умолча-
нию установлено 8), возможно, придется закрыть часть текущих описа-
телей, как, например, описатель 3 (стандартный AUX).

Версии: DOS 2.00 и выше.

DOS, функция 3Fh
Читать файл через описатель

ВХ — описатель файла

DS:DX — адрес буфера для чтения данных

СХ — число считываемых байт

CF=0, если функция выполнена успешно

AX — число действительно прочитанных байт
CF=1, если при выполнении функции возникли ошибки

СХ байт данных считываются из файла или устройства с описателем,
указанным в ВХ. Данные читаются с текущей позиции указателя чте-
ния/записи файла и помещаются в буфер вызывающей программы, ад-
ресуемый через DS:DX. Если необходимо установить позицию чтения/
записи, можно использовать функцию 42h. Эта функция обновляет ука-
затель чтения/записи файла, чтобы подготовиться к последующим опе-
рациям чтения или записи.

Версии: DOS 2.00 и выше.

DOS, функция 40h
Писать в файл через описатель

ВХ — описатель файла

DS:DX — адрес буфера, содержащего записываемые данные

СХ — число записываемых байт

CF=0, если функция выполнена успешно

AX — число действительно записанных байт
CF°1, если при выполнении функции возникли ошибки

СХ байт данных записываются в файл или на устройство с описателем,
заданным в ВХ. Данные берутся из буфера, адресуемого через DS:DX,
и записываются, начиная с текущей позиции указателя чтения/записи
файла. Чтобы установить указатель файла, если необходимо, можно ис-
пользовать функцию 42h. Обновляет указатель чтения/записи файла,
чтобы подготовиться к последующим операциям чтения или записи.

Версии: DOS 2.00 и выше.

DOS, функция 41h
Удалить файл

AH^lh
DS:DX — адрес строки ASCIZ с именем файла

CF=0, если функция выполнена успешно

АХ не сохранен
CF=1, если при выполнении функции возникли ошибки

Файл удаляется из оглавления заданного диска. Если диск и/или путь
не указаны, принимаются значения по умолчанию. Имя файла не может
содержать обобщенные символы («?» и «*»). Если файл имеет атрибут
«только чтение», то перед удалением необходимо изменить этот атрибут
через функцию 43h.

Версии: DOS 2.00 и выше.

DOS, функция 42h
Переместить указатель файла

ВХ — описатель файла ^
CX:DX на сколько передвинуть указатель: (CX*65536)+DX
AL=OOh переместить относительно начала файла +CX:DX
AL=01h переместить относительно текущей позиции +CX:DX
AL=02h переместить относительно конца файла +CX:DX

CF=0, если функция выполнена успешно

DX:AX новая позиция указателя файла (если нет ошибки)
CF=1, если при выполнении функции возникли ошибки

Перемещает логический указатель чтения/записи к нужной позиции.

Очередная операция чтения или записи начнется с этого адреса.

Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX.

Действительная длина файла равна (DX*65536)+AX.

Версии: DOS 2.00 и выше.

DOS, функция 43h
Установить/опросить атрибуты файла

DS:DX — адрес строки ASCIZ с именем файла

AL=OOh — извлечь текущий атрибут файла

AL=01h — установить атрибут файла

СХ — новый атрибут файла (для подфункции 01Ь)(Таблица Б-9)

CF=0, если функция выполнена успешно

СХ — текущий атрибут файла (для подфункции ООЬ)(Таблица Б-9)

АХ не сохранен
CF=1, если при выполнении функции возникли ошибки

Таблица Б-9. Атрибуты файла.

Бит Атрибут
Только чтение
1 Скрытый
2 Системный
3 Метка тома (может находиться только в корневом каталоге)
4 Директория
5 Архивный

Атрибут файла читается или устанавливается, согласно коду в AL.

Если диск и/или путь не указаны, принимаются значения по умолчанию.

Чтобы скрыть оглавление, нужно использовать CX=02h (а не 12h, как

можно было ожидать).

Версии: DOS 2.00 и выше.

DOS, функция 44h
Управление устройством ввода/вывода

AH=44h
AL — код подфункции:

AL=OOh — получить информацию об устройстве
AL=01h — установить информацию об устройстве
AL=02h — читать с символьного устройства
AL=03h — писать на символьное устройство
AL=04h — читать с блочного устройства
AL=05h — писать на блочное устройство
AL=06h — дать статус ввода
AL=07h — дать статус вывода
AL=08h — запрос съемного носителя
AL=09h — запрос удаленного устройства
AL=OAh — запрос удаленного описателя
AL=OBh — счет повторов разделения
AL=OCh — кодовые страницы 3.3

AL-ODh — общий IOCTL

AL=OEh — получить логическое устройство

AL=OFh — установить логическое устройство

Версии: DOS 2.00 и выше.

DOS, функция 45h
Дублировать описатель файла

AH-45h
ВХ — существующий описатель файла

CF=0, если функция выполнена успешно

AX — новый описатель файла, дублирующий оригинал
CF=1, если при выполнении функции возникли ошибки

Создает дополнительный описатель файла, ссылающийся на тот же по-
ток ввода/вывода, что и существующий описатель. Любое продвижение
указателя чтения/записи одного описателя (включая любые операции
чтения, записи или перемещения указателя посредством функции 42h)
действует на его дубликат.

Версии: DOS 2.00 и выше.

DOS, функция 46h
Переназначить описатель

ВХ — целевой описатель файла (должен уже существовать)

СХ — исходный описатель файла (должен уже существовать)

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

Заставляет описатель файла (handle) ссылаться на другой файл или ус-
тройство. Если описатель в СХ (источник) открыт, он закрывается,

а затем становится дубликатом описателя в ВХ (назначения). Иными
словами, описатели в СХ и ВХ будут ссылаться на один и тот же физи-
ческий файл или устройство.

Версии: DOS 2.00 и выше.

DOS, функция 47h
Получить текущее оглавление DOS

DS:SI — адрес локального буфера для результирующего пути — 64 байта

DL — номер диска (0 — текущий, 1 — А и так далее)

CF=0, если функция выполнена успешно

АХ не сохранен
CF=1, если при выполнении функции возникли ошибки

В буфер по адресу DS:SI помещается в форме ASCIZ путь текущего ог-
лавления для диска, указанного в DL. Путь возвращается в формате:

«путь\оглавление»,0. Впереди не подставляется буква диска, а сзади не
подставляется символ «\». Например, если текущим является корневое
оглавление, эта функция вернет пустую строку (DS:[SI]=0).

Версии: DOS 2.00 и выше.

DOS, функция 48h
Выделить память

AH^Sh
ВХ — запрошенное количество памяти в 16-байтных параграфах

CF=0, если функция выполнена успешно

АХ — сегментный адрес распределенного блока
CF»!, если при выполнении функции возникли ошибки

ВХ — размер максимального доступного блока памяти (в параграфах)

Распределяет блок памяти длиной ВХ параграфов, возвращая сегмент-
ный адрес этого блока в АХ (блок начинается с АХЮООО). Если распре-
деление неудачно, устанавливается флаг CF, в АХ возвращается код
ошибки, а ВХ содержит максимальный размер доступной для распреде-
ления памяти (в параграфах). Чтобы определить наибольший доступ-
ный блок, общепринято устанавливать BX=FFFFh перед вызовом.
Распределение завершится с ошибкой, возвратив размер максимально-
го блока памяти в ВХ.

Версии: DOS 2.00 и выше.

DOS, функция 49h
Освободить блок памяти

AH=49h
ES — сегментный адрес освобождаемого блока памяти

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
АХ — код ошибки

Освобождает блок памяти, начинающийся с адреса ES:0000. Этот блок
становится доступным для других запросов системы. Вообще говоря,
нужно освобождать лишь те блоки памяти, которые получены через
функцию 48h (распределить память). Родитель отвечает за освобожде-
ние памяти порожденных процессов. Тем не менее, ничто не препят-
ствует освобождать память чужих процессов.

Версии: DOS 2.00 и выше.

DOS, функция 4Ah
Изменить размер блока памяти

ES — сегмент распределенного блока памяти

ВХ — нужный размер блока в 16-байтных параграфах

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки
AX — код ошибки
ВХ — размер максимального доступного блока памяти (в параграфах)

Изменяет размер существующего блока памяти. Когда программа полу-
чает управление, функция 4Bh уже распределила блок памяти, начиная
с PSP, который содержит всю доступную память. Чтобы освободить па-
мять для запуска порождаемых процессов, блок памяти, начинающийся
с PSP, необходимо сначала сжать.

Примечание.
Функция 31h и INT 27h (TSR) сжимают блок по адресу PSP.

Версии: DOS 2.00 и выше.

DOS, функция 4Bh
Выполнить или загрузить программу

DS:DX — адрес строки ASCIZ с именем файла, содержащего программу

ES:BX — адрес ЕРВ (блока параметров ЕХЕС)

AL=°OOh — загрузить и выполнить

AL=01h — загрузить, но не выполнять

AL=03h — загрузить программный оверлей

CF=0, если функция выполнена успешно

ВХ, DX не сохранены
СЕ=1, если при выполнении функции возникли ошибки

Данная функция загружает в память и запускает программу, имя кото-
рой указано в регистрах DS:DX. Запущенная программа после заверше-
ния работы возвратит управление запускаемой. Если диск или путь
не указаны, принимаются значения по умолчанию. ES:BX указывает
на блок памяти, подготовленный как ЕРВ, формат которого зависит
от запрошенной подфункции в AL.

Версии: DOS 2.00 и выше.

DOS, функция 4Ch
Завершить программу

AH=4Ch
AL — код выхода

Возвращает управление от порожденного процесса его родителю, уста-
навливая код выхода (его можно опросить функцией 4Dh). Управление
передается по адресу завершения в PSP завершающейся программы.
Векторы Ctrl-Break и Critical Error восстанавливаются к старым адре-
сам, сохраненным в родительском PSP.

Значение ERRORLEVEL (используемое в пакетных файлах DOS)
можно использовать для проверки кода выхода самой последней про-
граммы.

Версии: DOS 2.00 и выше.

DOS, функция 4Dh
Получить код выхода программы

АН — код выхода последнего завершившегося процесса

AH=OOh — нормальное завершение

AH=01h — завершение через Ctrl-Break INT 23h

AH=02h — завершение по критической ошибке устройства INT 24h

AH=03h — завершение через функцию 31h

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

Версии: DOS 2.00 и выше.

DOS, функция 4Eh
Найти первый совпадающий файл

DS:DX — адрес строки ASCIZ с именем файла (допускается использо-
вать символы «?» и «*»)
СХ — атрибут файла для сравнения

CF^^O, если функция выполнена успешно

DTA заполнена данными (Таблица Б-10)
CF=1, если при выполнении функции возникли ошибки

Если диск и/или путь не указаны, принимаются значения по умолча-
нию. Обобщенные символы «*» и «?» допускается использовать в име-
ни файла и расширении.

Версии: DOS 2.00 и выше.

DOS, функция 4Fh
Найти следующий совпадающий файл

DS:DX — адрес данных, возвращенных предыдущей 4Eh (Найти пер-
вый файл)

CF=0, если функция выполнена успешно

DTA заполнена данными
CF°1, если при выполнении функции возникли ошибки

Эту функцию можно использовать после вызова 4Eh. Следующее имя фай-
ла, совпадающее по обобщенному имени и атрибуту файла, копируется
в буфер по адресу DS:DX вместе с другой информацией (Таблица Б-10).

Примечание.
Параметр DS:DX добавлен в DOS 3.0.

Версии: DOS 2.00 и выше.

DOS, функция 52h
Получить адрес векторной таблицы связи

(Официально не документирована)

ES:BX — адрес векторной таблицы связи (Таблица Б-11)

Описание.
Данная функция возвращает адрес векторной таблицы связи.

Версии: DOS 2.00 и выше.

Таблица Б-]]. Формат векторной таблицы связи.

Смещ. Размер Описание
-18h слово Содержимое СХ при вызове INT 21h при AX=5E01h
-16h слово Счетчик для кэшируемых FCB
-14h слово Счетчик для открытых FCB
-12h двойное слово Адрес обработчика OEM-функций (FFFFh:FFFFh,
если обработчик не установлен)
-OEh слово Смещение в кодовом сегменте DOS кода
возврата из прерывания INT 21h
-ОСЬ слово Счетчик повторов
-OAh слово Задержка повтора
-08h двойное слово Указатель на буфер текущего диска
-04h слово Сегмент данных DOS
-02h слово Сегмент первого МСВ
+00h двойное слово Указатель на первый блок параметров диска
+04h двойное слово Указатель на первую системную файловую таблицу
+08h двойное слово Указатель на заголовок активного драйвера часов
+OCh двойное слово Указатель на заголовок активного драйвера консоли

DOS, функция 54h
Получить переключатель верификации DOS

AL=OOh, если верификация выключена (OFF)
AL=01h, если верификация включена (ON)

Возвращает текущий статус верификации записи DOS. Если в AL воз-
вращается 1, то DOS считывает обратно каждый сектор, записываемый
на диск, чтобы проверить правильность записи. Функция DOS 2Eh по-
зволяет установить/изменить режим верификации.

Версии: DOS 2.00 и выше.

DOS, функция 56h
Переименовать/переместить файл

DS:DX — адрес старого ASCIZ имени (путь/имя существующего файла)

ES.-DI — адрес нового ASCIZ имени (новые путь/имя)

CF^O, если функция выполнена успешно
CF^l, если при выполнении функции возникли ошибки
AX — код ошибки

Старое имя DS:DX должно существовать и не может содержать обоб-
щенных символов. Диск и путь необязательны (если они не указаны,
принимаются значения по умолчанию). Новое имя ES:DI должно опи-
сывать несуществующий файл. Если указан диск, он должен быть тем
же, что и в старом имени. Если диск или путь не указаны, принимают-
ся текущие. Если старое и новое имя содержат разные пути (явные или
принятые по умолчанию), то элемент оглавления для файла перемеща-
ется в оглавление, указанное в новом имени.

Версии: DOS 2.00 и выше.

DOS, функция 57h
Установить/опросить дату/время файла

AL=OOh — получить дату/время файла

AL=01h — установить дату/время файла

ВХ — описатель файла (handle)

СХ (если AL=1) — новая отметка времени в формате время файла

DX (если AL=1) — новая отметка даты в формате дата файла

CF=0, если функция выполнена успешно

СХ — (если при вызове AL=0) отметка времени файла в формате
время/дата файла (Таблица Б-12)

DX — (если при вызове AL=0) отметка даты файла в формате вре-
мя/дата файла (Таблица Б-13)

CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

ВХ должен содержать описатель открытого файла (см. 3Ch или 3Dh).
DX и СХ задаются в формате памяти (например, младшие 8 бит даты
находятся в DH).

Версии: DOS 2.00 и выше.

DOS, функция 59h
Получить расширенную информацию об ошибке

AH°59h
BX-OOOOh (номер версии: ООООЬ для DOS 3.0, 3.1 и 3.2)

Таблица Б-12. Формат времени файла. Таблица Б-13. Формат даты файла.

Биты Описание
15-11 Часы
10-5 Минуты
4-0 Секунды/2
Биты Описание
15-9 Год-1980
8-5 Месяц
4-0 Дата

AX — расширенный код ошибки (0, если ошибки не было)

ВН — класс ошибки

BL — предлагаемое действие

СН — сфера (где произошла ошибка)

Эту функцию можно использовать, чтобы уточнить, что предпринять
после сбоя функции DOS по ошибке (только DOS 3.0+). Ее можно вы-
зывать: в обработчике критических ошибок INT 24h, после любой фун-
кции INT 21h, возвратившей флаг переноса после вызова FCB-функ-
ции, возвратившей AL=FFh.

Версии: DOS 3.00 и выше.

DOS, функция 5Ah
Создать уникальный временный файл

DS:DX — адрес строки ASCIZ с диском и путем (заканчивается симво-
лом «\») \
СХ — атрибут файла

CF=0, если функция выполнена успешно

AX — описатель файла

DS:DX — (не изменяется) полное ASCIZ-имя нового файла
CF=1, если при выполнении функции возникли ошибки

Открывает (создает) файл с уникальным именем в каталоге, заданном
строкой ASCIZ, на которую указывает DS:DX. COMMAND.COM вызы-
вает эту функцию, когда создает временные «канальные» файлы, ис-
пользуемые при переназначении ввода-вывода. Описание пути должно
быть готово к добавлению в его конец имени файла. Необходимо обес-
печить минимум 12 байт в конце строки. Сама строка должна быть за-
полнена в одной из форм: «d:\nyrb\»,0 (указан диск и путь), «d>,0 (те-
кущее оглавление диска) или «d:\»,0 (корневое оглавление диска).

Версии: DOS 3.00 и выше.

DOS, функция 5Bh
Создать новый файл

DS:DX — адрес строки ASCIZ с именем файла

СХ — атрибут файла

CF=0, если функция выполнена успешно

AX — описатель файла
CF=1, если при выполнении функции возникли ошибки

Файл открывается для чтения/записи в совместимом режиме доступа.
Если диск и/или путь не указаны, принимаются значения по умолча-
нию. Этот вызов идентичен функции DOS 3Ch с тем исключением, что
он вернет ошибку, если файл с заданным именем уже существует.

Версии: DOS 3.00 и выше.

DOS, функция 5Ch
Блокировать/разблокировать доступ к файлу

AL=OOh — заблокировать область файла

AL=01h — разблокировать ранее заблокированную область

ВХ — описатель файла

CX-.DX — смещение ((CX*65536)+DX) от начала файла

SLDI — длина блокируемой области ((SI*65536)+DI) байт

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

Блокирует или освобождает доступ к участку файла, указанного в ВХ.

Область файла с логическим смещением CX:DX и длиной SLDI

блокируется (захватывается) или разблокируется (освобождается). Сме-
щение и длина обязательно должны быть указаны. Разделение файлов
должно быть активизировано (командой SHARE), иначе функция вернет
код ошибки «Неверный номер функции».

Версии: DOS 3.00 и выше (при обязательной загрузке SHARE).

DOS, функция 62h
Получить адрес PSP

ВХ — сегментный адрес PSP выполняющейся программы

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

Версии: DOS 3.00 и выше.

DOS, функция 65h
Получить расширенную информацию страны

AH=65h DOS 3.3
AL — подфункция:

AL=01h — дать расширенную информацию страны DOS 3.3
AL=02h — дать таблицу преобразования строчных букв в прописные
AL=04h — то же для символов, допустимых в именах файлов
AL=06h — дать сопоставляющую последовательность
DX — код страны

ВХ — кодовая страница (FFFFh — консоль)
СХ — размер буфера возврата (должен быть минимум 5 байт)
ES:DI — адрес буфера возврата

CF=0, если функция выполнена успешно

ES:DI — адрес возвращенной информации
CF=1, если при выполнении функции возникли ошибки:

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

Версии: DOS 3.30 и выше.

DOS, функция 66h
Получить/установить глобальную кодовую страницу

AL=01h — запросить текущую глобальную кодовую страницу

AL=02h — установить активную кодовую страницу

ВХ — (при AL=02h) кодовая страница (Таблица Б-14)

DX — (при AL=02h) системная кодовая страница (устанавливаемая при

CF=0, если функция выполнена успешно

ВХ — (если при вызове AL=01h) текущая активная кодовая страница
DX — (если при вызове AL=01h) системная кодовая страница (уста-
навливаемая при загрузке)

CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

Эта функция выбирает новую кодовую страницу или получает значение
текущей активной кодовой страницы (страниц). Программа DOS
NLSFUNC должна быть загружена до этого вызова. Функция использу-
ется в сочетании с 65h или 38h.

Устанавливая новую активную кодовую страницу, DOS читает данные

из файла COUNTRY.SYS.

Версии: DOS 3.30 и выше.

Таблица Б-14. Значения кодовых страниц.

Кодовая
страница
Страна (язык)
437 Соединенные Штаты Америки
850 Многоязыковая
857 Турция
860 Португалия
861 Исландия
863 Канада (французский)
865 Норвегия
866 Россия

DOS, функция 67h
Установить число описателей файлов

AH=67h
ВХ — максимальное число описателей (до FFFFh)

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

Эта функция устанавливает максимальное число описателей файлов,
которые могут быть открыты одновременно. Если значение ВХ меньше
20, то принимается 20. Если значение ВХ меньше текущего максимума
(нужно сократить число описателей), и в данный момент открыто более
чем ВХ файлов, то изменение будет иметь место, когда число открытых
файлов не будет превышать устанавливаемый максимум. Если ВХ боль-
ше текущего максимума (нужно увеличить число описателей), то DOS
должна иметь доступную память, чтобы распределить ее под новые опи-
сатели. Функция 4Ah позволяет освободить память, чтобы она стала
доступной DOS.

Версии: DOS 3.30 и выше.

DOS, функция 68h
Завершить файл

AH=68h
ВХ — описатель завершаемого файла

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

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

Версии: DOS 3.3 и выше. В версиях DOS от 2.0 до 3.2 можно использо-
вать функцию DOS 45h, чтобы создать и затем закрыть дубликат.

Илон Маск рекомендует:  Использование списков
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL