Недокументированные возможности ms dos прерывания 30h и 31h


Функция 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 Изменить Атрибут)

Основные функции прерывания MS DOS 21h

Прерывание 21h (DOS) предназначено для предоставления программисту различных услуг со стороны DOS. Этими услугами является набор функций.

Последовательность действий при использовании этих функций:

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

2. Поместить передаваемые функции параметры в определенные регистры (для каждой ф-ции соответствующие)

3. Вызвать прерывание командой int 21h

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

Основные функции ввода, вывода для прерывания 21h:

00h — завершение работы программы

01h – ожидание набора символа с последующим его эхосопровождением и с проверкой на CTRL+BREAK

На выходе в AL — ACSII-код символа.

02h – изображение (вывод) символа с проверкой на CTRL+BREAK.

На входе в DL — ACSII-код символа

05h — вывод символа на принтер.

На входе в DL — ACSII-код символа

06h – изображение символа без проверки на CTRL+BREAK.

На входе в DL — ACSII-код символа

07h – ожидание набора символа без последующего его эхосопровождения и без проверки на CTRL+BREAK

На выходе в AL — ACSII-код символа.

08h – ожидание набора символа с последующим его эхосопровождением и с проверкой на CTRL+BREAK

На выходе в AL — ACSII-код символа.

09h — изображение строки символов с проверкой на CTRL+BREAK.

На входе — DS:DX = начальному адресу строки с символом $ на конце.

0ah – чтение строки в буфер клавиатуры.

На входе DS:DX = адрес буфера с форматом:

1 байт — размер буфера для ввода (формирует пользователь)

2 байт — число фактически введенных символов (заполняет система по окончанию ввода-нажатию Enter (0dh), этот символ не считает)

3 байт и далее — введенная строка с символом 0dh на конце

На выходе — введенная строка в буфере

0bh – чтение состояния клавиатуры

На выходе AL = 0 — буфер НЕ пуст

AL = offh – буфер клавиатуры пуст

0сh – освобождение буфера клавиатуры и вызов нужной функции

На входе в AL – номер нужной функции

На выходе – регистры в соответствии с вызываемой функцией

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

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

Лучшие изречения: Только сон приблежает студента к концу лекции. А чужой храп его отдаляет. 8808 — | 7523 — или читать все.

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

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

очень нужно


СТРУКТУРА DOS

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

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

Деление сервисных функций DOS на два уровня обусловлено соображениями модульности и будущего развития системы. Функции, реализуемые модулем MSDOS.SYS, в первую очередь используются командами DOS (обрабатываемыми командным процессором: DIR, COPY и др.), но с тем же успехом они могут вызываться прикладными программами.

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

Все функции сгруппированы в соответствии с характером предоставляемого ими сервиса. Так, функции с шестнадцатиричными кодами О

-С обеспечивают посимвольный обмен со стандартными внешними устройствами. Функции D-24 и 27-29 составляют обширную номенклатуру для работы с файловой системой, причем все они опираются на использование так называемого «блока управления файлами» (FСB-File Control Block) — специальной таблицы с параметрами, сопровождающими каждый файл. В этих операциях используется также выделенная область памяти для передачи данных между прикладной программой и функциями DOS (DTA — Data/Disk Transfer Area).

Начиная с версии 2.0, в ДОС введены новые функции для работы с файловой системой (частично повторяющие старые). Коды этих функций: ЗС

-46. Они более удобны для работы (в них не используется FCB и можно не задавать адрес DTA) и при этом не противоречат старым, так что возможно их совместное использование. Некоторые из новых функций (40, 44) обеспечивают работу с дисковыми файлами и с внешними устройствами, трактуемыми как файлы. Это дает дополнительное удобство с точки зрения разработки прикладных программ.

Обе указанные группы дополняются функциями работы с каталогами иерархической файловой системы. Эти функции имеют шестнадцатиричные номера 11-12, 39-3В, 45-47, 4E-4F, 56-57.

Для разработки больших прикладных систем, состоящих из наборов взаимодействующих программ, большую ценность представляют функции 31 и 48-4D, позволяющие выделять и освобождать области памяти, а также загружать в оперативную память и запускать подчиненные программы (подзадачи). При образовании и запуске подзадачи ей передаются все файлы, открытые в ведущей («родительской») задаче, а также описание операционной среды, в которой с помощью команд конфигурации могут быть определены различные параметры.

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

Следует также обратить внимание на три особых прерывания под десятичными номерами 34-36. В отличие от всех других прерываний, обслуживаемых DOS, эти три прерывания могут обслуживаться самой прикладной программой. В векторы этих прерываний прикладная нрограмма может занести адреса своих резидентных подпрограмм, которые должны адекватным образом (т.е. в соответствии с замыслом разработчика) обрабатывать три особые ситуации.
1. Завершение задачи.
2. Прерывание задачи в результате нажатия пользователем клавиш Ctrl + Break.
3. Возникновение «фатальной» (неисправимой) ошибкн.

Илон Маск рекомендует:  Excel vba как отменить выделение диапазона ячеек

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

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

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

2. Использование подпрограмм DOS, доступных через прерывания 32-63, дает в руки разработчика широкий диапазон средств для работы с аппаратурой ПЭВМ и файловой системой. (Кстати говоря, встроенные и библиотечные функции языков высокого уровня в конечном счете тоже транслируются в прерывания ДОС, хотя этого не видно, в исходном тексте программы, с которым имеет дело разработчик). Большинство современных трансляторов с языков высокого уровня для ПЭВМ обеспечивает возможность прямого обращения к прерываниям ДОС с помощью специальных процедур. Параметры таких процедур обычно указывают номер прерывания и значения основных регистров микропроцессора. При необходимости можно делать то же самое и несколько иначе — путем составления небольших программ на языке ассемблера и последующей совместной загрузки этих программ с программами на языке высокого уровня.

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

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

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

Функции прерывания MS-DOS 33h

1. Функция 00h— сброс драйвера мыши. Сбрасывает (инициализирует) драйвер мыши.

Входные данные: AX = 0000H

Выходные данные:AX = состояние мыши

AX = FFFFH: драйвер мыши установлен

AX = 0000H: ошибка, драйвер мыши не установлен

BX = число кнопок мыши

Примечания: Программа инициализации выполняет следующие задачи: перемещает маркер мыши в центр экрана и стирает его изображение на экране. После разрешения вывода маркера маркер мыши по умолчанию имеет вид инверсного прямоугольника. Этот маркер всегда воспроизводится на нулевой экранной странице независимо от текущего видеорежима. Областью перемещения мыши становится весь экран. Устанавливает обработчик событий (event handler) (по умолчанию не устанавливается). Устанавливает эмуляцию светового пера (по умолчанию не устанавливается). Задает скорость перемещения маркера мыши. По умолчанию относительная скорость равно 8 микки на 8 горизонтальных элементов и 16 микки на 16 вертикальных. Задает максимальную скорость мыши (по умолчанию равна 64 микки в секунду). Микки (mickey) – это самое маленькое расстояние, которое отслеживается мышью. Оно примерно равно 1/200 дюйма.

2. Функция 01h— вывод маркера мыши. Выводит на экран маркер мыши. Этот маркер отображает любое движение мыши, перемещаемой пользователем.

Входные данные: AX = 0001H

Выходные данные: Отсутствуют

Примечания: Эта функция увеличивает на единицу значение внутреннего счетчика, который определяет, должен ли маркер мыши быть виден на экране. После инициализации драйвера мыши функцией 00H этот счетчик содержит -1 (т.е. маркер мыши не виден). Когда после обращения к функции 01H значение этого счетчика становится нулевым, маркер мыши появляется на экране. Драйвер мыши отображает перемещение мыши даже тогда, когда маркер не воспроизводится на экране. После обращения к этой функции маркер может появляться не в том месте, в каком он находился в момент удаления маркера в результате обращения к функции 00H или 02H.

3. Функция 02h — удаление маркера мыши. Удаляет маркер мыши с экрана.

Входные данные: AX = 0002H

Выходные данные: Отсутствуют

Примечания: Эта функция уменьшает на единицу значение внутреннего счетчика, который определяет, должен ли маркер мыши быть виден на экране. Если счетчик имеет значение 0, то маркер мыши воспроизводится на экране; если счетчик имеет значение -1, то маркер удаляется с экрана. Драйвер мыши отображает перемещение мыши даже тогда, когда маркер не воспроизводится на экране. После обращения к этой функции маркер может появляться не в том месте, в каком он находился в момент удаления маркера в результате обращения к функции 00H или 02H.

4. Функция 03h — чтение положения маркера/состояния кнопок. Возвращает текущее положение маркера мыши и текущее состояние кнопок мыши.

Входные данные: AX = 0003H

Выходные данные: BX = состояние кнопок мыши

Бит 0 = 1:нажата левая кнопка

Бит 1 = 1:нажата правая кнопка

Бит 2 = 1:нажата средняя кнопка

Биты 3-15: не используются

CX = координата X

DX = координата Y

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

5. Функция 04h — перемещение маркера мыши. Перемещает активный маркер мыши в указанную точку экрана.

Входные данные: AX = 004H

CX = координата X


DX = координата Y

Выходные данные: Отсутствуют

Примечания: Координаты, возвращаемые в регистрах CX и DX, являются координатами элементов изображения на виртуальном экране мыши, а не физическими координатами на реальном экране. Если указанная в обращении позиция находится за пределами диапазона перемещения маркера мыши, заданного функциями 07H и 08H, то функция корректирует координаты таким образом, что маркер остается внутри диапазона. Маркер перемещается в новую позицию даже в том случае, если он не воспроизводится на экране. После того, как воспроизведение маркера мыши снова будет разрешено, он появится в новой позиции.

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

Входные данные: AX = 0005H

BX = кнопка мыши

BX = 0: левая кнопка мыши

BX = 1: правая кнопка мыши

BX = 2: средняя кнопка мыши

Выходные данные:BX = состояние всех кнопок мыши:

Бит 0 = 1: нажата левая кнопка

Бит 1 = 1: нажата правая кнопка

Бит 2 = 1: нажата средняя кнопка

Биты 3-15: не используются

CX = горизонтальная координата в момент

DX = вертикальная координата маркера в момент

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

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

Входные данные: AX = 0006H

BX = кнопка мыши

BX = 0: левая кнопка мыши

BX = 1: правая кнопка мыши

BX = 2: средняя кнопка мыши

Выходные данные:BX = состояние всех кнопок мыши:

CX = горизонтальная координата маркера в

момент последнего отпускания кнопки.

DX = вертикальная координата маркера в момент

последнего отпускания кнопки.

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

8. Функция 07h — задание диапазона перемещения по горизонтали. Определяет диапазон перемещения маркера мыши по горизонтали. После того, как диапазон установлен, пользователь не может вывести маркер мыши за его пределы.

Входные данные: AX = 0007H

CX = минимальная горизонтальная координата

DX = максимальная горизонтальная координата

Выходные данные: Отсутствуют

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

9. Функция 08h — задание диапазона перемещения мыши по вертикали. Определяет диапазон перемещения маркера мыши по вертикали. После того, как диапазон установлен, пользователь не может вывести маркер мыши за его пределы.

Входные данные: AX = 0008H

CX = минимальная вертикальная

DX = максимальная вертикальная координата

Выходные данные: Отсутствуют

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

10. Функция 09h — описание маркера мыши (в графическом режиме). Описывает внешний вид маркера мыши в графическом режиме, а также битовое поле, корректирующее элементы изображения вокруг маркера мыши.

Входные данные: AX = 0009H

BX = ширина маркера, начиная с левого края

CX = высота маркера, начиная с верхнего края

EX = адрес сегмента битового поля

DX = смещение битового поля

Выходные данные: Отсутствуют

Примечания: Битовое поле состоит из 64 байтов, из которых первые 32 являются результатом операции AND, а остальные 32 байта результат операции OR с текущими элементами изображения.

11. Функция 0ah— описание маркера мыши (в тестовом режиме). Описывает битовую маску, определяющую внешний вид маркера в текстовом режиме.


Входные данные: AX = 000AH

BX = тип маркера

BX = 0: программный

BX = 1: аппаратный

CX = маска AND (программный маркер) или

начальная линия (аппаратный маркер)

DX = маска XOR (программный маркер) или

конечная линия (аппаратный маркер)

Выходные данные: Отсутствуют.

Примечания: Если выбран программный маркер, то код символа, находящегося под маркером, и байт атрибутов этого символа логически умножаются (AND) на маску, заданную в регистре CX, а затем выполняется операция «исключающее или» (XOR) между результатом умножения и маской в регистре DX. Для байта атрибутов эти операции выполняются со старшим байтом регистров CX и DX (CH и DH), а для кода символа с младшим байтом (CL и DL). Аппаратный маркер имеет такую же форму как обычный текстовый курсор. В монохромном режиме значения начальной и конечной линий изменяются в диапазоне от 0 до 13. В цветном режиме значение линий изменяется от 0 до 7.

12. Функция 0bh — определение величины перемещения. Определяет расстояние между текущим положением мыши и положением мыши в момент последнего обращения к функции 0BH.

Входные данные: AX = 000BH

Выходные данные:CX = расстояние от последней

точки по горизонтали (в микки)

DX = расстояние от последней точки

по вертикали (в микки).

Примечания: Эти значения должны интерпретироваться как числа со знаком. Положительные значения указывают на перемещение в нижнюю или правую часть экрана, а отрицательные — в верхнюю или левую часть экрана. Расстояния выражены в микки (1 микки = 1/200 дюйма), а не в элементах изображения.

12. Функция 0fh — задание скорости маркера. Устанавливает соотношение между микки (1 микки = 1/200 дюйма) и элементами изображения на экране. Это соотношение определяет чувствительность мыши и скорость перемещения по экрану.

Входные данные: AX = 000FH

CX = число микки по горизонтали

DX = число микки по вертикали

Выходные данные: Отсутствуют.

Примечания: Значения регистров CX и DX могут изменяться в диапазоне от 1 до 32767. По умолчанию скорость задается равной 8 микки по горизонтали и 16 микки по вертикали. Таким образом, по горизонтали маркер двигается вдвое быстрее, чем по вертикали. Обращение к функции 00H (сброс драйвера мыши) отменяет любые установленные значения скорости и заменяет их значениями по умолчанию.

13. Функция 10h — область исключения. Описывает любую область экрана как область исключения. При входе в область исключения маркер мыши исчезает.

Входные данные: AX = 0010H

CX = координата X, верхний левый угол области

DX = координата Y, верхний левый угол области

SI = координата X, правый нижний угол области

DI = координата Y, правый нижний угол области

Выходные данные: Отсутствуют.

Примечания: Координаты, передаваемые в регистрах CX, DX, DI и SI описывают положение элементов изображения на виртуальном экране мыши, а не физические координаты на реальном экране. Обращение к функции 00H (сброс драйвера мыши) или к функции 01H (вывод маркера мыши) отменяет координаты области исключения.

Илон Маск рекомендует:  background-position в CSS

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

Входные данные: AX = 0013H

DX = предельная скорость, выраженная в микки

Выходные данные: Отсутствует

Примечания: 1 микки — 1/200 дюйма. Чтобы предотвратить удвоение скорости мыши, можно установить более высокий предел. Скорость свыше 5000 микки в секунду достичь практически невозможно.

15. Функция 1ah — задание чувствительности мыши. Определяет соотношение между физическим перемещением и перемещением маркера мыши. Определяет также максимальную скорость, при которой происходит удвоение скорости мыши.

Входные данные: AX = 001AH

BX = число микки по горизонтали

CX = число микки по вертикали

DX = предельная скорость для удвоения скорости

Выходные данные: Отсутствуют.

Примечания: Значения регистров CX и DX могут изменяться от 1 до 32767. По умолчанию устанавливается 8 микки по горизонтали и 16 микки по вертикали. Таким образом, по горизонтали маркер движется вдвое быстрее, чем по вертикали. Чтобы предотвратить удвоение скорости мыши, можно установить более высокий предел. Скорость свыше 5000 микки в секунду достичь практически невозможно. Обращение к функции 00H (сброс драйвера мыши) отменяет установленные ранее значения скорости и заменяет их значениями по умолчанию.

16. Функция 1bh — определение чувствительности мыши. Возвращает параметры, установленные ранее в результате обращения к функциям 1ah,0fh или 13h.

Входные данные: AX = 001BH

Выходные данные: BX = число микки по горизонтали

CX = число микки по вертикали

DX = предельное значение скорости

для удвоения скорости мыши

17. Функция 1ch — задание интенсивности аппаратных прерываний мыши. Определяет частоту считывания аппаратным обеспечением мыши текущего положения мыши и состояния ее кнопок


Входные данные: AX = 001CH

BX = интенсивность прерываний

Бит 0: прерывание отсутствует

Бит 1: 30 прерываний в секунду

Бит 2: 50 прерываний в секунду

Бит 3: 100 прерываний в секунду

Бит 4: 200 прерываний в секунду

Бит 5-15: не используются

Выходные данные: Отсутствуют.

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

18. Функция 1fh — деактивизация драйвера мыши. Переводит в неактивное состояние текущий драйвер мыши и возвращает адрес программы обработки прерывания, которая использовалась для прерывания 33H.

Входные данные: AX = 001FH

Выходные данные: AX = код ошибки:

AX = FFFFH: ошибка

AX = 001FH: ошибка

ES = адрес сегмента

использовавшегося обработчика событий

BX = смещение использовавшегося обработчика

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

19. Функция 20h — активизация драйвера мыши. Активизирует драйвер мыши, отключенный ранее функцией 1FH.

Входные данные: AX = 0020H

Выходные данные: Отсутствуют.

20. Функция 21h — сброс драйвера мыши. Инициализирует драйвер мыши и запрещает маркер мыши и установленный на данный момент обработчик событий.

Входные данные: AX = 0021H

Выходные данные: AX = состояние ошибки:

AX = FFFFH: ошибка

AX = 0021H: без ошибок

BX = число кнопок мыши

Примечания: В отличие от функции 00H эта функция не выполняет полного аппаратного сброса устройства.

21. Функция 24h — определение типа мыши. Определяет тип установленной мыши и номер версии драйвера мыши.

Входные данные: AX = 0024H

Выходные данные: BH = целая часть номера версии

BL = дробная часть номера версии

CH = 1: параллельная мышь

CH = 2: последовательная мышь

CH = 3: подключенная к порту мышь

CH = 5: мышь фирмы «Хьюлетт Пакард»

CL = 2,3,4,5 или 7: номер IRQ в PC.

Примечания: Если номер версии драйвера равен, например, 6.24, то значение 6 возвращается в регистре BH, а 24 в регистре BL.

Таким образом, функции драйвера вызываются через прерывание 33h. Записав номер функции в регистр AX, результат получаем в регистрах AX, BX, CX, DX. Для генерации программного прерывания процессора 8086 можно воспользоваться библиотечной функцией языка Си int86, которая имеет следующий прототип:

int int86(int intr_num, union REGS*inregs, union REGS*outregs); — функция генерирует программное прерывание микропроцессора 8086, причем номер прерывания определяется аргументом intr_num. Перед выполнением прерывания функция копирует значения регистров из объединения inregs в сами регистры. После возврата из прерывания, функция копирует текущие значения регистров в параметр outregs.

Прерывание 30H дает неправильную версию DOS

Я запускаю 32-битную копию Windows 8 на 64-разрядном процессоре AMD. Я беру курс сборки 8086, и в книге приведен пример того, как получить номер версии DOS. Когда я запускаю cmd.exe, он говорит мне, что это версия 6.2.9200. Кроме того, когда я запускаю команду «VER» DOS, она говорит мне то же самое. Однако, когда я выполняю процедуру прерывания 30H для получения номера версии DOS, он сообщает мне, что я запускаю DOS версии 5.0. Что может объяснить это различие?

Кстати, я собрал код ниже в MASM6, используя команду ML/Fl DOSVER.ASM .

Номер версии, который вы видите в верхней части интерфейса командной строки и который возвращается командой VER , представляет собой версию Windows, а не версию DOS . Насколько я понимаю, интерфейс командной строки Windows является эмулятором DOS, а не фактическим экземпляром MS-DOS. Похоже, что системы на базе Windows NT, которые будут включать Windows 8, будут эмулировать версию MS-DOS версии 5.0 (это, кажется, предлагается здесь и здесь), что, похоже, согласуется с тем, что вы описываете.

Организация оперативной памяти в MS DOS

MCB (Memory Control Block) является блоком DOS, описывающим каждый распределенный участок памяти. Как правило, MCB всегда строится перед PSP исполняемой программы и для «окружения» программы. Рассмотрим формат MCB.

Таблица 1. Формат MCB

Смещение Длина Содержимое
00h 1 тип блока:
‘M’ (4Dh) — промежуточный блок;
‘Z’ (5Ah) — последний блок
01h 2 сегмент владельца блока, 0 — свободный блок
03h 2 количество параграфов в блоке
05h 3 резерв
08h 9 имя программы формата ASCIZ для блоков с PSP

Размер блока — 16 байт.


Для определения первого блока цепочки можно воспользоваться недокументированной функцией MSDOS 52h, которая в es:bx возвращает list of list, в es:[bx-2] находится сегмент первого MCB блока.

Описатель начала цепочки UMB блоков находится по адресу 9FFF:0000 (недокументировано).

Обработка событий в MSDOS

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

Первые 1024 байта — это таблица векторов (Interupt Table), содержащая для каждого из 256 векторов двухсловный указатель на обработчик. При вызове соответствующего прерывания контроллер прерываний сохраняет в стеке регистр флагов, устанавливает запрет прерываний с большим или равным номером IRQ (для аппаратных прерываний) сохраняет в стеке CS, IP и передает управление обработчику прерываний. Обработчик должен выполнить необходимые действия и вернуть управление командой IRET. В некоторой литературе ошибочно написано о необходимости разрешить прерывания перед возвратом, — этого делать не следует, т.к. после разрешения прерывания, перед инструкцией IRET начинается обработка следующего прерывания стоящего в очереди, и есть высокая вероятность получения сообщения:

Internal Stack Overflow. System halted.

Возможно два способа обработки событий своим обработчиком:

  1. полная замена обработчика;
  2. встраивание в цепочку обработчиков прерывания.

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

Встраивание в цепочку обработчиков прерывания происходит по следующей схеме:

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

Команды Pushf и Call Far имитируют Int, команды Pushf, Popf, Retf 2 делают Iret, но возвращают вызвавшей программе флаги, которые вернул старый обработчик.

Приемы «красивого встраивания» с заменой части команды:

СТРУКТУРА DOS

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

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

Деление сервисных функций DOS на два уровня обусловлено соображениями модульности и будущего развития системы. Функции, реализуемые модулем MSDOS.SYS, в первую очередь используются командами DOS (обрабатываемыми командным процессором: DIR, COPY и др.), но с тем же успехом они могут вызываться прикладными программами.

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

Все функции сгруппированы в соответствии с характером предоставляемого ими сервиса. Так, функции с шестнадцатиричными кодами О

-С обеспечивают посимвольный обмен со стандартными внешними устройствами. Функции D-24 и 27-29 составляют обширную номенклатуру для работы с файловой системой, причем все они опираются на использование так называемого «блока управления файлами» (FСB-File Control Block) — специальной таблицы с параметрами, сопровождающими каждый файл. В этих операциях используется также выделенная область памяти для передачи данных между прикладной программой и функциями DOS (DTA — Data/Disk Transfer Area).

Начиная с версии 2.0, в ДОС введены новые функции для работы с файловой системой (частично повторяющие старые). Коды этих функций: ЗС

-46. Они более удобны для работы (в них не используется FCB и можно не задавать адрес DTA) и при этом не противоречат старым, так что возможно их совместное использование. Некоторые из новых функций (40, 44) обеспечивают работу с дисковыми файлами и с внешними устройствами, трактуемыми как файлы. Это дает дополнительное удобство с точки зрения разработки прикладных программ.

Обе указанные группы дополняются функциями работы с каталогами иерархической файловой системы. Эти функции имеют шестнадцатиричные номера 11-12, 39-3В, 45-47, 4E-4F, 56-57.

Для разработки больших прикладных систем, состоящих из наборов взаимодействующих программ, большую ценность представляют функции 31 и 48-4D, позволяющие выделять и освобождать области памяти, а также загружать в оперативную память и запускать подчиненные программы (подзадачи). При образовании и запуске подзадачи ей передаются все файлы, открытые в ведущей («родительской») задаче, а также описание операционной среды, в которой с помощью команд конфигурации могут быть определены различные параметры.

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

Следует также обратить внимание на три особых прерывания под десятичными номерами 34-36. В отличие от всех других прерываний, обслуживаемых DOS, эти три прерывания могут обслуживаться самой прикладной программой. В векторы этих прерываний прикладная нрограмма может занести адреса своих резидентных подпрограмм, которые должны адекватным образом (т.е. в соответствии с замыслом разработчика) обрабатывать три особые ситуации.
1. Завершение задачи.
2. Прерывание задачи в результате нажатия пользователем клавиш Ctrl + Break.
3. Возникновение «фатальной» (неисправимой) ошибкн.

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

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

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

2. Использование подпрограмм DOS, доступных через прерывания 32-63, дает в руки разработчика широкий диапазон средств для работы с аппаратурой ПЭВМ и файловой системой. (Кстати говоря, встроенные и библиотечные функции языков высокого уровня в конечном счете тоже транслируются в прерывания ДОС, хотя этого не видно, в исходном тексте программы, с которым имеет дело разработчик). Большинство современных трансляторов с языков высокого уровня для ПЭВМ обеспечивает возможность прямого обращения к прерываниям ДОС с помощью специальных процедур. Параметры таких процедур обычно указывают номер прерывания и значения основных регистров микропроцессора. При необходимости можно делать то же самое и несколько иначе — путем составления небольших программ на языке ассемблера и последующей совместной загрузки этих программ с программами на языке высокого уровня.

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

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

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

Управление процессами в MS-DOS

Процессы в MS-DOS

Как говорилось выше, управление процессами в однозадачных ОС, к которым относится MS-DOS, является сравнительно тривиальной задачей.

Загрузка ОС завершается запуском программы командного интерпретатора COMMAND.COM, в задачи которого входит:

· чтение и анализ команд, вводимых пользователем с клавиатуры;

· выполнение внутренних команд системы, таких, как команда выдачи содержания каталога, команды копирования, удаления и переименования файлов и т.п.;

· запуск на выполнение системных и прикладных программ;

· обработка критических ошибок, происшедших в ходе выполнения системных функций MS-DOS;

· завершение работы программы с освобождением всех ресурсов, занимавшихся программой.

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

Некоторым исключением из правила «одна активная задача» являются резидентные программы MS-DOS, рассмотренные в п. 4.4.5.

Среда программы

Среда программы (environment; другой перевод – «окружение») представляет собой текстовый массив, состоящий из строк вида:

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

Понятие среды было введено в системе UNIX и позаимствовано оттуда в MS-DOS и Windows без особых изменений.

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

Можно рассматривать переменные среды как своего рода параметры, передаваемые программе при ее запуске, аналогично тому, как подпрограмма получает параметры при вызове. Интерпретатор команд COMMAND.COM также имеет свою среду, которую называют корневой средой. Для создания переменных корневой среды, их удаления и изменения значений может использоваться системная команда SET. Когда COMMAND.COM запускает программу пользователя или одна программа запускает другую, создается порожденный процесс, который получает собственный экземпляр блока среды, при этом по умолчанию создается точная копия среды родителя, однако можно создать совершенно иную среду.


Запуск программы

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

Функция Exec требует указания ряда параметров, из которых важны:

· Имя файла запускаемой программы. Если имя не содержит пути к каталогу, то файл ищется в текущем каталоге, а также в каталогах, перечисленных в переменной PATH.

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

· Адрес массива, содержащего параметры среды программы. Если он не задан, то для запускаемой программы создается копия среды программы-родителя.

В MS-DOS используются два формата выполняемых программ.

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

Файл формата EXE представляет собой перемещаемую программу. Файл состоит из заголовка, словаря перемещений и собственно кода. Информация в заголовке позволяет указать размер части файла, которая должна загружаться в память при запуске программы, максимальный и минимальный размер памяти, дополнительно резервируемой для размещения данных, начальный адрес стека, адрес запуска программы. Размер файла практически не ограничен, но размер загружаемой части должен быть в пределах, предоставляемых DOS, т.е. примерно 500 – 550 Кб.

Первые два байта EXE-файла содержат сигнатуру (признак) файла формата EXE, в качестве которой используются две буквы ‘MZ'[10]. Считается, что это инициалы программиста Марка Збиковского, который участвовал в разработке MS-DOS.

При запуске программы система выполняет следующие действия:

· Выделяет два непрерывных блока памяти: для параметров среды (блок среды) и для самой программы (блок PSP). Для программы, как правило, выделяется максимально возможный непрерывный блок памяти, если только в заголовке EXE-файла не задан меньший размер.

· Определяет размер загружаемой части программы (для COM-файла это весь файл), и считывает из файла коды программы.

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

· Формирует в начале блока программы массив, который называется PSP (Program Segment Prefix). В PSP содержатся, в частности, адрес блока среды, адрес возврата в родительскую программу, адрес и размер таблицы JFT, сама эта таблица, командная строка программы.

· Заполняет первые 5 элементов таблицы JFT (стандартные хэндлы), копируя их из JFT родительской программы.

· Заносит начальные значения в регистры процессора.

· Запоминает адрес PSP программы в качестве идентификатора текущего процесса (PID, Process IDentifier).

· Наконец, выполняет переход на адрес запуска программы. Для COM-файла этот адрес следует сразу за PSP, для EXE-файла в заголовке может быть указан любой адрес.

Завершение работы программы

Завершение программы обычно включает в себя следующие действия системы:

· Закрываются все файлы, открытые программой.

· Освобождаются все блоки памяти, отведенные для программы и ее среды.

· Восстанавливаются стандартные обработчики описанных ниже прерываний int 23h и int 24h, которые могли быть изменены отработавшей программой.

· Управление передается родительской программе.

В MS-DOS определены 4 возможные причины, которые могут вызвать завершение работы программы.

· Нормальное завершение. Оно происходит, когда программа вызывает системную функцию Terminate. В качестве аргумента этой функции программа передает код завершения – число, уточняющее причину завершения. Обычно код завершения 0 означает, что программа проработала благополучно, а ненулевые значения указывают на различные неприятности (отсутствие файла для обработки, неверный формат данных и т.п.).

· Завершение по запросу пользователя. Оно происходит, если пользователь нажимает одну из комбинаций клавиш Ctrl+C или Ctrl+Break. Система не торопится прекращать работу программы, пока не вызовет программное прерывание int 23h. В зависимости от результата, возвращаемого обработчиком этого прерывания, программа либо будет завершена, либо продолжит работу. По умолчанию система сама обрабатывает прерывание и сама себе отвечает: «Завершить программу». Однако программа может взять обработку прерывания на себя и ответить системе: «Продолжаем работать». Так обычно и поступают все серьезные программы MS-DOS.

· Завершение по критической ошибке. Критической считается ошибка, происшедшая в ходе выполнения какой-либо системной функции MS-DOS и имеющая аппаратный характер (точнее, обнаруженная драйвером устройства). Например, отсутствие файла не является критической ошибкой, а ошибка чтения с диска – является. Система вызывает программное прерывание int 24h, передавая как аргументы подробное описание ошибки (на каком устройстве, при какой операции и т.п.). В ответ система хочет получить от обработчика указание, как реагировать на ошибку. Имеется 4 вида реакции: Ignore – игнорировать ошибку; Retry – повторно выполнить операцию, вызвавшую ошибку; Abort – завершить программу; Fail – вернуть код ошибки программе пользователя. Системный обработчик прерывания запрашивает требуемую реакцию у пользователя. Однако программа и в данном случае может взять обработку прерывания на себя и попытаться автоматически выбрать желаемую реакцию на основании описания ошибки.

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

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

Последнее изменение этой страницы: 2020-02-05; Нарушение авторского права страницы

Ассемблер

Прерывание 21h: общие функции DOS

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

Функция 02: вывод одного символа на экран

Для вывода одного символа на экран ПК используется

функция 02 прерывания 21h:

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

Особым образом осуществляется вывод символов с кодами 7, 8, 9, 10 (0Ah) и 13 (0Dh). Символ с кодом 7 (bell, звонок) на экране не высвечивается (и курсор не сдвигается), а вызывает звуковой сигнал. Символ с кодом 8 (backspase, шаг назад) возвращает курсор на одну позицию влево, если только он не был в самой левой позиции строки. Символ с кодом 9 (tab, табуляция) смещает курсор вправо на ближайшую позицию, кратную 8. Символ с кодом 10 (line feed, перевод строки) перемещает курсор в следующую строку экрана, оставляя его в той же колонке. Символ с кодом 13 (carrige returne, возврат каретки) устанавливает курсор на начало текущей строки; вывод подряд символов с кодами 13 и 10 означает перевод курсора на начало следующей строки.

Функция 9: вывести строку на экран дисплея

Для вывода на экран строки (последовательности символов) можно, конечно, использовать функцию 02, однако сделать это можно и за один прием с помощью функции 09 прерывания 21h:

DS:DX := начальный адрес строки

Перед обращением к этой функции в регистр DS должен быть помещен номер того сегмента памяти, в котором находится выводимая строка, а в регистр DX — смещение строки внутри этого сегмента. При этом в конце строки должен находиться символ $ (код 24h), который служит признаком конца строки и сам не выводится.

Хотя эта функция может оказаться намного удобнее функций побайтового вывода на экран (функция 2 и 6), она имеет тот недостаток, что вполне обычный символ $ используется как ограничитель строки. Это еще один побочный продукт совместимости с CP/M.

Расширенные функции операционной системы DOS в качестве ограничителя строки используют CHR$(0). Это соответствует соглашениям, принятым в операционной системе UNIX и языке программирования Си.

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

Функция 4Ch: завершение программы

Завершив все свои действия, программа обязана вернуть управление операционной системе, чтобы пользователь мог продолжить работу на ПК. Такой возврат реализуется функцией 4Ch прерывания 21h, которую помещают в конце программы:

Каждая программа, вообще говоря, обязана сообщить, успешно или нет она завершила свою работу. Дело в том, что любая программа вызывается из какой-то другой программы (например, из операционной системы), и иногда вызвавшей программе, чтобы правильно продолжить работу, надо знать, выполнила ли вызванная программа все, что надо, или она проработала с ошибкой. Такая информация передается в виде кода завершения программы (некоторого целого числа), который должен быть нулевым, если программа проработала правильно, и ненулевым (каким именно — оговаривается в каждом случае особо) в противном случае. (Узнать код завершения вызванной программы можно с помощью функции 4Dh прерывания 21h.) Потребуется этот код или нет, программа все равно должна выдать его.

Илон Маск рекомендует:  Что такое код isxdigit
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL