Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

3. Транзитная часть загружается в самые старшие адреса памяти.

"Транзит" обозначает, что DOS может перекрыть данную область другими

программами, если потребуется. Транзитная часть программы COMMAND.COM

выводит на экран приглашение DOS A> или C>, вводит и выполняет

запросы. Она содержит настраивающий загрузчик и предназначена для

загрузки COM- или EXE-файлов с диска в память для выполнения. Если

поступил запрос на выполнение какой-либо программы, то транзитная

часть строит префикс программного сегмента (PSP) непосредственно

вслед за резидентной частью COMMAND.COM. Затем она загружает

запрошенную программу с диска в память по смещению шест.100 от начала

программного сегмента, устанавливает адреса выхода и передает

управление в загруженную программу. Ниже приведена данная

последовательность:

Ibmbio.Com

Ibmdos.Com

COMMAND.COM (резидент)

Префикс программного сегмента

Выполняемая программа

...

COMMAND.COM (транзитная часть, может быть перекрыта).

Выполнение команды RET или INT 20H в конце программы приводит к

возврату в резидентную часть COMMAND.COM. Если транзитная часть была

перекрыта, то резидентная часть перезагружает транзитную часть с диска в

память.

ПРЕФИКС ПРОГРАММНОГО СЕГМЕНТА

________________________________________________________________

Префикс программного сегмента (PSP) занимает 256 (100H) байт и всегда

предшествует в памяти каждой COM- или EXE-программе, которая должна быть

выполнена. PSP содержит следующие поля:

00 Команда INT 20H (CD20).

02 Общий размер доступной памяти в формате хххх0. Напримеp, 512K

указывается как 8000H вместо 80000H.

04 Зарезервировано.

05 Длинный вызов диспетчера функций DOS.

0A Адрес подпрограммы завершения.

0E Адрес подпрограммы реакции на Ctrl/Break.

12 Адрес подпрограммы реакции на фатальную ошибку.

16 Зарезервировано.

2C Сегментный адрес среды для хранения ASCIIZ строк.

50 Вызов функций DOS (INT 21H и RETF).

5C Параметрическая область 1, форматированная как стандартный

неоткрытый блок управления файлов (FCB#1).

6C Параметрическая область 2, форматированная как стандартный

неоткрытый блок управления файлом (FCB#2); перекрывается, если

блок FCB#1 открыт.

80-FF Буфер передачи данных (DTA).

Буфер передачи данных DTA

---------------------------

Данная часть PSP начинается по адресу 80H и представляет собой

буферную область ввода-вывода для текущего дисковода. Она содержит в

первом байте число, указывающее сколько раз были нажаты клавиши на

клавиатуре непосредственно после ввода имени программы. Начиная со второго

байта, находятся введенные символы (если таковые имеются). Далее следует

всевозможный "мусор", оставшийся в памяти после работы предыдущей

программы. Следующие примеры демонстрируют назначение буфера DTA:

П р и м е р 1. Команда без операндов. Предположим, что вы вызвали

программу CALCIT.EXE для выполнения с помощью команды CALCIT [return].

После того, как DOS построит PSP для этой программы, он установит в буфере

по адресу шест.80 значение шест.000D. Первый байт содержит число символов,

введенных с клавиатуры после имени CALCIT, исключая символ "возврат

каретки". Так как кроме клавиши Return не было нажато ни одной, то число

символов равно нулю. Второй байт содержит символ возврата каретки,

шест.0D. Таким образом, по адресам шест.80 и 81 находятся 000D.

П р и м е р 2. Команда с текстовым операндом. Предположим, что после

команды был указан текст (но не имя файла), например, COLOR BY,

обозначающий вызов программы COLOR и передачу этой программе параметра

"BY" для установки голубого цвета на желтом фоне. В этом случае, начиная с

адреса шест.80, DOS установит следующие значения байт:

80: 03 20 42 59 0D

Эти байты обозначают длину 3, пробел, "BY" и возврат каретки.

П р и м е р 3. Команда с именем файла в операнде. Программы типа DEL

(удаление файла) предполагают после имени программы ввод имени файла в

качестве параметра. Если будет введено, например, DEL B:CALCIT.OBJ

[return], то PSP, начиная с адресов шест.5C и шест.80, будет содержать:

5C: 02 43 41 4C 43 49 54 20 20 4F 42 4A

C A L C I T O B J

80: 0D 20 42 3A 43 41 4C 43 49 54 2E 4F 42 4A 0D

B : C A L C I T . 0 B J

Начиная с адреса шест.5C, находится неоткрытый блок FCB, содержащий

имя файла, который был указан в параметре, CALCIT.OBJ, но не имя

выполняемой программы. Первый символ указывает номер дисковода (02=B в

данном случае). Следом за CALCIT находятся два пробела, которые дополняют

имя файла до восьми символов, и тип файла, OBJ. Если ввести два параметра,

например:

progname A:FILEA,B:FILEB

тогда DOS построит FCB для FILEA по смещению шест.5C и FCB для FILEB по

смещению шест.6C.

Начиная с адреса шест.80 в этом случае содержится число введенных

символов (длина параметров) - 16, пробел (шест.20) A:FILEA,B:FILEB и

символ возврат каретки (OD).

Так как PSP непосредственно предшествует вашей программе, то возможен

доступ к области PSP для обработки указанных файлов или для предпринятия

определенных действий. Для локализации буфера DTA COM-программа может

просто поместить шест.80 в регистр SI и получить доступ следующим образом:

MOV SI,80H ;Адрес DTA

CMP BYTE PTR [SI],0 ;В буфере нуль?

JE EXIT

Для EXE-программы нельзя с уверенностью утверждать, что кодовый

сегмент непосредственно располагается после PSP. Однако, здесь при

инициализации регистры DS и ES содержат адрес PSP, так что можно сохранить

содержимое регистра ES после загрузки регистра DS:

MOV AX,DSEG

MOV DS,AX

MOV SAVEPSP,ES

Позже можно использовать сохраненный адрес для доступа к буферу PSP:

MOV SI,SAVEPSP

CMP BYTE PTR [SI+ 80H],0 ;В буфере нуль?

JE EXIT

DOS версии 3.0 и старше содержит команду INT 62H, загружающую в регистр BX

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

ВЫПОЛНЕНИЕ COM-ПРОГРАММЫ

________________________________________________________________

В отличие от EXE-файла, COM-файл не содержит заголовок на диске. Так

как организация COM-файла намного проще, то для DOS необходимо "знать"

только то, что тип файла - COM.

Как описано выше, загруженным в память COM- и EXE-файлам предшествует

префикс программного сегмента. Первые два байта этого префикса содержат

команду INT 20H (возврат в DOS). При загрузке COM-программы DOS

устанавливает в четырех сегментных регистрах адрес первого байта PSP.

Затем устанавливается указатель стека на конец 64 Кбайтового сегмента

(шест.FFFE) или на конец памяти, если сегмент не достаточно большой. В

вершину стека заносится нулевое слово. В командный указатель помещается

шест.100 (размер PSP). После этого управление передается по адресу

регистровой пары CS:IP, т.е. на адрес непосредственно после PSP. Этот

адрес является началом выполняемой COM-программы и должен содержать

выполнимую команду.

При выходе из программы команда RET заносит в регистр IP нулевое

слово, которое было записано в вершину стека при инициализации. В этом

случае в регистровой паре CS:IP получается адрес первого байта PSP, где

находится команда INT 20H. При выполнении этой команды управление

передается в резидентную часть COMMAND.COM. (Если программа завершается по

команде INT 20H вместо RET, то управление непосредственно передается в

COMMAND.COM).

ВЫПОЛНЕНИЕ EXE-ПРОГРАММЫ

________________________________________________________________

EXE-модуль, созданный компановщиком, состоит из следующих двух

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

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

В заголовке находится информация о размере выполняемого модуля,

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

должны заполнить машинные адреса в соответствии с относительными шест.

позициями:

00 Шест.4D5A. Компоновщик устанавливает этот код для идентификации

правильного EXE-файла.

02 Число байтов в последнем блоке EXE-файла.

04 Число 512 байтовых блоков EXE-файла, включая заголовок.

06 Число настраиваемых элементов.

08 Число 16-тибайтовых блоков (параграфов) в заголовке, (необходимо для

локализации начала выполняемого модуля, следующего после заголовка).

0A Минимальное число параграфов, которые должны находится после

загруженной программы.

0C Переключатель загрузки в младшие или старшие адреса. При компановке

программист должен решить, должна ли его программа загружаться для

выполнения в младшие адреса памяти или в старшие Обычным является

загрузка в младшие адреса. Значение шест.0000 указывает на загрузку в

старшие адреса, а шест.FFFF - в младшие. Иные значения определяют

максимальное число параграфов, которые должны находиться после

загруженной программы.

0E Относительный адрес сегмента стека в выполняемом модуле.

10 Адрес,который загрузчик должен поместить в регистр SP перед передачей

управления в выполнимый модуль.

12 Контрольная сумма - сумма всех слов в файле (без учета переполнений)

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

14 Относительный адрес, который загрузчик должен поместить в регистр IP

до передачи управления в выполняемый модуль.

16 Относительный адрес кодового сегмента в выполняемом модуле. Этот

адрес загрузчик заносит в регистр CS.

18 Смещение первого настраиваемого элемента в файле.

1A Номер оверлейного фрагмента: нуль обозначает, что заголовок относится

к резидентной части EXE-файла.

1C Таблица настройки, содержащая переменное число настраиваемых

элементов, соответствующее значению по смещению 06.

Заголовок имеет минимальный размер 512 байтов и может быть больше,

если программа содержит большое число настраиваемых элементов. Позиция 06

в заголовке указывает число элементов в выполняемом модуле, нуждающихся в

настройке. Каждый элемент настройки в таблице, начинающейся в позиции 1C

заголовка, состоит из двухбайтовых величин смещений и двухбайтовых

сегментных значений.

Система строит префикс программного сегмента следом за резидентной

частью COMMAND.COM, которая выполняет операцию загрузки. Затем COMMAND.COM

выполняет следующие действия:

- Считывает форматированную часть заголовка в память.

- Вычисляет размер выполнимого модуля (общий размер файла в

позиции 04 минус размер заголовка в позиции 08) и загружает модуль в

память с начала сегмента.

- Считывает элементы таблицы настройки в рабочую область и

прибавляет значения каждого элемента таблицы к началу сегмента

(позиция OE).

- Устанавливает в регистрах SS и SP значения из заголовка и

прибавляет адрес начала сегмента.

- Устанавливает в регистрах DS и ES сегментный адрес префикса

программного сегмента.

- Устанавливает в регистре CS адрес PSP и прибавляет величину

смещения в заголовке (позиция 16) к регистру CS. Если сегмент кода

непосредственно следует за PSP, то смещение в заголовке равно 256

(шест.100). Регистровая пара CS:IP содержит стартовый адрес в кодовом

сегменте, т.е. начальный адрес программы.

После инициализации регистры CS и SS содержат правильные адреса, а

регистр DS (и ES) должны быть установлены в программе для их собственных

сегментов данных:

1. PUSH DS ;Занести адрес PSP в стек

2. SUB AX,AX ;Занести нулевое значение в стек

3. PUSH AX ; для обеспечения выхода из программы

4. MOV AX,datasegname ;Установка в регистре DX

5. MOV DS,AX ; адреса сегмента данных

При завершении программы команда RET заносит в регистр IP нулевое

значение, которое было помещено в стек в начале выполнения программы. В

регистровой паре CS:IP в этом случае получается адрес, который является

адресом первого байта PSP, где расположена команда INT 20H. Когда эта

команда будет выполнена, управление перейдет в DOS.

ПРИМЕР EXE-ПРОГРАММЫ

________________________________________________________________

Рассмотрим следующую таблицу компановки (MAP) программы:

Start Stop Length Name Class