Читайте также:
|
|
Все программы, запускаемые на выполнение в операционной системе DOS, загружаются в память с помощью функции Exec (Int 21h, функция 4Bh). Кроме загрузки программы, эта функция формирует PSP (префикс программного сегмента) загружаемой программы, создает копию окружения, а также настраивает регистры. Эту функцию может вызывать как COMMAND.COM, так и любой другой запущенный процесс, в том числе и пользовательский.
При запуске программы в DOS, ей отводится вся свободная память. Для того чтобы загрузить дочерний процесс, родительская программа должна определить объём памяти необходимый ей для выполнения, освободить неиспользуемую память, уменьшив выделенную ей память до необходимого размера. Операции с памятью реализуются функциями 48h (выделить блок памяти), 49h (освободить выделенную память) и 4Ah (изменить размер уже выделенного блока).
Размеры .СОМ и. ЕХЕ программ вычисляются различным образом. Для определения размера .ЕХЕ программы, состоящей из трех сегментов -сегмента кода, данных и стека, следует включить в программу пустой фиктивный сегмент, расположив его после всех остальных сегментов. Этому сегменту необходимо присвоить произвольный класс, гак как сегменты одного класса располагаются в памяти друг за другом. Сегменты без имени класса принадлежат к безымянному классу. Возможна ситуация, когда фиктивный сегмент без класса будет загружен сразу после другою сегмента без класса, а не в самом конце программы, как требуется. Учитывая, что при загрузке в регистре es находится адрес начала программы (адрес PSP), размер программы типа ЕХЕ можно определить следующим образом:
EXEC загружает в память программу типа. СОМ, начиная с адреса PSP: 0100h, и передает; ей управление. При загрузке программы типа. ЕХЕ, в которой есть команды вызова дальних процедур (сегментов данных), DOS изменяет эти команды так, чтобы используемые в них сегментные адреса соответствовали сегментным адресам, по которым загружены в память указанные процедуры (сегменты данных).
После загрузки программы типа. СОМ содержимое регистров следующее:
- в AL будет код OFFh, если первый аргумент командной строки содержит ошибочное имя диска, иначе - 00h;
- в АН будет код OFFh, если второй аргумент командной строки содержит ошибочное имя диска, иначе - 00h;
- в регистры CS, DS, ES, SS загружается сегментный адрес PSP;
- в IP записывается 100Н, смещение точки входа в программу;
- в SP - адрес последнего слова в сегменте (обычно OFFFEh; меньше, если не хватает памяти). Пользователь может выделить буфер под стек и, естественно, установить другое значение SP.
При запуске программы типа. ЕХЕ регистры ES, DS загружаются сегментным адресом PSP, CS - сегментным адресом кода программы, SS -сегментным адресом стека, а SP - адресом вершины стека, на IP записывается смещение точки входа в программу.
Затем в стек помещается слово OOOOh и управление передаётся на стартовую точку программы (для программы типа СОМ - PSP:0100h; для программы типа. ЕХЕ - указанная в директиве END точка входа).
Дата добавления: 2015-02-16; просмотров: 72 | Поможем написать вашу работу | Нарушение авторских прав |