Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы_дополн_ГОС_2007.doc
Скачиваний:
41
Добавлен:
10.02.2016
Размер:
1.87 Mб
Скачать

Вопрос 74. Com и exe программы. Их особенности и правила написания.

В ОС MS-DOS существуют два типа исполняемых программ: COM и EXE. COM-программы ограничены в размере 64 Кбайтами (1 сегмент). При этом в одном сегменте находятся код программы, ее данные и ее стек. При старте программы типа COM вершина стека находится в самых старших адресах сегмента. Если количества свободной памяти в старших адресах сегмента недостаточно, программа может выделить под стек доп-ный блок памяти и переустановить содержимое регистров SS и SP.

EXE-программы, как правило, используют несколько сегментов. При этом код программы, ее данные и ее стек находятся в разных сегментах.

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

Заголовок EXE-программы состоит из форматированной зоны, которая содержит 14 фиксированных полей, и таблицы перемещения сегментов (Relocation Table), которая может находиться в любом месте программы.

Содержимое форматированной зоны заголовка EXE-файла:

Смещение Размер Содержимое

0h 2 Идентификатор EXE-файла ('MZ')

2h 2 Длина неполной страницы (байт, <= 512)

4h 2 Длина программы (вкл. заголовок, в страницах по 512 б)

6h 2 Количество элементов в Relocation Table

8h 2 Длина заголовка (в параграфах)

0Ah 2 Мин. необходимое программе количество памяти (в парагр.)

0Ch 2 Макс. необходимое программе количество памяти (в парагр.)

0Eh 2 Начальное значение регистра SS

10h 2 Начальное значение регистра SP

12h 2 Контрольная сумма всех слов файла

14h 2 Начальное значение регистра IP } точка

16h 2 Начальное значение регистра CS } входа

18h 2 Адрес первого элемента Relocation Table относительно начала файла (как правило, 001Ch)

1Ah 2 Номер оверлея (0 для главного модуля)

Процесс загрузки программ в память.

I. Общая часть для программ обоих типов.

1) Определяется сегментный адрес свободного участка памяти для загрузки программы.

2) Создаются 2 блока памяти (для переменных среды, и для PSP+программы).

3) Формируется блок переменных среды.

4) Заполняются поля PSP (Int 21h fn 26h).

5) Адрес DTA (Data Transfer Area, используется в файловых операциях с применением FCB) устанавливается на вторую половину PSP.

II. Для программ типа COM.

6) Сегментные регистры DS, CS, SS и ES устанавливаются по PSP.

7) Регистр SP устанавливается на конец сегмента PSP.

8) Файл считывается в память по адресу <сегмент PSP>:0100h.

9) В стек записывается слово 0.

10) Выполняется операция jmp PSP:100h - начинается выполнение программы.

III. Для программ типа EXE.

6) В локальную область памяти считывается 1Ch байт заголовка EXE-файла.

7) Определяется размер загружаемого блока данных:

<размер> = ((<кол-во страниц> * 512) - (<размер заголовка> * 16)) + <длина неполной страницы>

8) Определяется смещение в файле загружаемого блока данных: <смещение> = <размер заголовка * 16>

9) Выбирается сегментный адрес, START_SEG, для загрузки блока данных (как правило, PSP+10h).

10) Выделяется память (с учетом значений минимального и максимального необходимого количества памяти).

11) Загрузочный модуль считывается в память по адресу START_SEG:0000.

12) Сканируются элементы Relocstion Table (RT). Для каждого элемента RT выполняются следующие действия:

а) элемент считывается, как два слова (OFF, SEG);

б) по формуле REL_SEG = (START_SEG + SEG) вычисляется сегментный адрес;

в) к слову по адресу REL_SEG:OFF добавляется значение START_SEG.

13) Инициализируются сегментные регистры:

а) ES = DS = PSP

б) SS = START_SEG + <значение SS>, SP = <значение SP>

в) CS = START_SEG + <значение CS>, IP = <значение IP>

Правила написания COM и EXE программ.

При написании COM-программ необходимо:

1) Включать в текст программы директиву компилятора org 100h для правильного вычисления адресов (с учетом того, что по адресу CS:0000 после загрузки программы в память находится PSP).

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

При написании EXE-программ необходимо:

1) Инициализировать регистра DS адресом сегмента данных программы.

2) Для использования в качестве возврата из программы команды retf можно сохранять в стеке сегментный адрес PSP и слово 0:

start: ; точка входа

push ds

xor ax, ax

push ax

. . .

retf ; возврат в MS-DOS

Последняя команда retf вызывает переход к началу PSP, где записана

команда завершения программы (int 20h).