Программирование в среде однозадачной операционной системы
МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«ПЕНЗЕНСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ
Е.В. Грачева
Системное программное обеспечение
Персональных ЭВМ
Пенза
2012 год
УДК681.3
Рецензенты
доктор технических наук, пофессор
зав.кафедрой «Вычислительные машины и системы»
И.И. Сальников;
доктор технических наук, пофессор
кафедры «Информационно-вычислительные системы»
Пензенского государственного университета
Б.В.Чувыкин
Грачева Е.В.
Системное программное обеспечение персональных ЭВМ:
Учебнле пособие /Е.В. Грачева – Пенза
Учебное пособие подготовлено на кафедре «Вычислительные машины и системы»
Пензенской государственной технологической академиии и предназначено для студентов высших учебных заведений,обучающихся поспециальности 230101.
Программирование в операционной среде
Операционной средой называется набор функций ОС, сервисов и правила обращения к ним. Поскольку каждая операционная система имеет свой набор функций и правил обращения к ним, программирование в операционной среде каждой ОС должно рассматриваться отдельно [1].
Программирование в среде однозадачной операционной системы
Программы для MS DOS могут быть одного из двух форматов: COM или EXE.
Программы типа COM не могут быть размером более 64 Кб и состоят только из одного сегмента – сегмента кода.
Размер программы типа EXE может превышать 64 кб.
В современных операционных средах приложения пользуются системными вызовами, число которых превышает 2000, в то время как в MS-DOS подобных функций гораздо меньше.
Главным входом большинства функций DOS служит прерывание, вызываемое с помощью команды INT 21h. Параметры функциям DOS передаются через регистры микропроцессора: AX (AH и AL), BX, CX, DX; регистровые пары DS:DX и ES:BX используются в основном при передаче адреса ячейки памяти. Через эти же регистры возвращаются результат работы функции DOS, кроме того могут быть установлены флаги в регистре флагов.
Как и любая операционная система, DOS загружает и выполняет программы. При загрузке программы в начале отводимого для нее блока памяти (для СОМ-программ это вся свободная на данный момент память) создается структура данных PSP (префикс программного сегмента) размером 256 байт (100h). Затем DOS создает копию текущего окружения для загружаемой программы, помещает полный путь и имя программы в конец окружения, заполняет поля PSP следующим образом:
+00h: слово – CDh 20h – команда INT 20h. Если СОМ-программа завершается командой RETN, управление передается на эту команду.
+02h: слово – сегментный адрес первого байта после области памяти, выделенной для программы
+04h: байт – не используется DOS
+05h: 5 байт – 9Ah F0h FEh 1Dh F0h – команда CALL FAR на абсолютный адрес 000C0h, записанная так, чтобы второй и третий байты составляли слово, равное размеру первого сегмента для СОМ-файлов (в этом примере FEF0h). Введено для совместимости с командой СР/М CALL 5.
+0Ah: 4 байта – адрес обработчика INT 22h (выход из программы)
+0Eh: 4 байта – адрес обработчика INT 23h (обработчик нажатия Ctrl-Break).
+12h: 4 байта – адрес обработчика INT 24h (обработчик критических ошибок)
+16h: слово – сегментный адрес PSP процесса, из которого был запущен текущий.
+18h: 20 байт – JFT – список открытых идентификаторов, один байт на идентификатор, FFh – конец списка.
+2Ch: слово – сегментный адрес копии окружения для процесса.
+2Eh: 2 слова – SS:SP процесса при последнем вызове INT 21h.
+32h: слово – число элементов JFT (по умолчанию 20).
+34h: 4 байта – дальний адрес JFT (по умолчанию PSP:0018).
+38h: 4 байта – дальний адрес предыдущего PSP.
+3Ch: байт – флаг, указывающий, что консоль находится в состоянии ввода 2-байтного символа.
+3Dh: байт – флаг, устанавливаемый функцией В711h прерывания 2Fh (при следующем вызове INT 21h для работы с файлом имя файла будет замечено на полное).
+3Eh: слово – не используется в DOS.
+40h: слово – версия DOS, которую вернет функция DOS 30h (DOS 5.0+).
+42h: 12 байт – не используется в DOS.
+50h: 2 байта – CDh 21h – команда INT 21h.
+54h: 7 байт – область для расширения первого FCB (FCB, FileControlBlok - это метод работы с файлами, являющийся рудиментом от ранних версий DOS'а. При его использовании можно работать только с файлами в текущем каталоге, причем даже нет возможности сменить каталог (точнее, даже понятия "каталог" в момент создания этих функций вообще не было). Современные программы эти функции не используют. MS-DOS обеспечивает две технологии обслуживания файлов. Первая была разработана при создании версий 1.Х. Эта технология основана на использовании структур данных, называемых блоками управления файлом (FCB). В то время подавляющее большинство компьютеров работало под управлением операционной системы CPM. Блоки FCB обеспечивали совместимость файлов MS-DOS с файлами этой системы. При разработке MS-DOS версий 2.Х, когда была предложена иерархическая структура организации файлов, была разработана вторая технология их обслуживания. Она основана на использовании ссылок на управляющую запись файла и не требует организации FCB. После того, как эта технология была опробована на операционной системе UNIX, она получила широкое распространение.).
+5Ch: 16 байт – первый FCB, заполняемый из первого аргумента командной строки.
+6Ch: 16 байт – второй FCB, заполняемый из второго аргумента командной строки.
+7Ch: 4 байта – не используется в DOS.
+80h: 128 байт – командная строка и область DTA по умолчанию.
Затем DOS записывает программу в память, начиная с адреса PSP:0100h.
Если загружается ЕХЕ-программа, использующая дальние процедуры или сегменты данных, DOS модифицирует эти команды так, чтобы используемые в них сегментные адреса соответствовали сегментным адресам, которые получили эти процедуры и сегменты данных при загрузке программы в память.
При запуске СОМ-программы регистры устанавливаются следующим образом:
AL = FFh, если первый параметр командной строки содержит неправильное имя диска (например, z:/something), иначе – 00h.
АН = FFh, если второй параметр содержит неправильное имя диска, иначе 00h.
CS = DS = ES = SS = сегментный адрес PSP.
SP = адрес последнего слова в сегменте (обычно FFFEh; меньше, если не хватает памяти).
При запуске ЕХЕ-программы регистры SS:SP устанавливаются в соответствии с сегментом стека, определенным в программе, затем в любом случае в стек помещается слово 0000h и выполняется переход на начало программы (PSP:0100h для СОМ, собственная точка входа для ЕХЕ).
Все эти действия выполняет одна функция DOS – DOS 4Bh – загрузить и выполнить программу. В качестве параметров этой функции передаются:
АН = 4Bh
AL = 00h – загрузить и выполнить;
AL = 01h – загрузить и не выполнять;
DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров ЕРВ:
+00h: слово – сегментный адрес окружения, которое будет скопировано для нового процесса (или 0, если используется текущее окружение)
+02h: 4 байта – адрес командной строки для нового процесса
+06h: 4 байта – адрес первого FCB для нового процесса
+0Ah: 4 байта – адрес второго FCB для нового процесса
+0Eh: 4 байта – здесь будет записан SS:SP нового процесса после его завершения (только для AL = 01)
+12h: 4 байта – здесь будет записан CS:IP (точка входа) нового процесса после его завершения (только для AL = 01)
AL = 03h – загрузить как оверлей;
DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров:
+00h: слово – сегментный адрес для загрузки оверлея
+02h: слово – число, которое будет использовано в командах, использующих непосредственные сегментные адреса, – обычно то же самое число, что и в предыдущем поле. 0 для СОМ-файлов
AL = 05h – подготовиться к выполнению (используется в ОС MS DOS начиная с версии 5.0 и выше)
DS:DX – адрес следующей структуры:
+00h: слово – 00h
+02h: слово:
бит 0 – программа – ЕХЕ
бит 1 – программа – оверлей
+04h: 4 байта – адрес ASCIZ-строки с именем новой программы
+08h: слово – сегментный адрес PSP новой программы
+0Ah: 4 байта – точка входа новой программы
+0Eh: 4 байта – размер программы, включая PSP
Вывод:
CF = 0, если операция выполнена, ВХ и DX модифицируются,
CF = 1, если произошла ошибка, АХ = код ошибки (2 – файл не найден, 5 – доступ к файлу запрещен, 8 – не хватает памяти, 0Ah – неправильное окружение, 0Bh – неправильный формат).
Как уже отмечалось, прерывание INT 21h (сервис DOS) служит главным входом большинства функций DOS. Программа, запрашивающая сервис DOS, должна подготовить всю необходимую информацию в регистрах и управляющих блоках, указать в регистре AH номер желаемой функции DOS и затем вызвать прерывание INT 21H.
В таблице 1 приведены функции прерывания INT 21h.
Таблица 1 -Функции прерывания INT21h