Вы находитесь на странице: 1из 5

ЛАБОРАТОРНАЯ РАБОТА 5. Программы .СОМ и .

EXE - формата

Цель работы: Ознакомление с порядком создания программ .СОМ и .EXE - формата


на языке Ассемблер в среде операционной системы MS-DOS, а также с анализом раздела
DTA в префиксе программного сегмента.

Методические указания
5.1. Основные особенности программ .СОМ и .EXE – формата
5.1.1 Программа .EXE – формата
Программы, работающие под управлением MS DOS, делятся на два основных
класса: типа .СОМ и типа .ЕХЕ.
Программы типа .СОМ являются односегментными: и программные строки, и
области данных, и стек размещаются в одном сегменте и не могут, следовательно,
превышать 64 Кбайт. Такие программы хранятся на диске в файлах типа .СОМ в виде
абсолютного образа памяти и переносятся в оперативную память в процессе загрузки
практически без изменений.
Программы типа .ЕХЕ не имеют таких жёстких ограничений. Они могут включать
любое число сегментов программы, данных и стека и их суммарный размер ничем не
ограничен.
Компоновщик TLINK не выделяет, и не в состоянии выделить – какой тип
программы вы желаете получить. TLINK автоматически генерирует формат ЕХЕ – файла.
Программа в формате ЕХЕ, созданная компоновщиком, состоит из следующих двух
частей:
1) заголовка – записи, содержащей информацию по управлению и настройке
программы;
2) собственно загрузочного модуля.
В заголовке хранятся следующие характеристики программы (длина, контрольная
сумма, адрес точки входа и др.), а также данные о настройке программных кодов при их
загрузке в память. (карта перемещений)
Необходимость считывать и обрабатывать эту информацию удлиняет процесс
загрузки, но программа оказывается более мобильной, т.к. её отдельные сегменты могут
быть загружены в несвязанные участки памяти и, в частности, совместно использоваться
несколькими процессами, что важно при организации многозадачных режимов.
Заголовок имеет минимальный размер 512 байт и может быть больше, если
программа содержит большое число настраиваемых элементов.
5.1.2 Программа .СОМ – формата
СОМ – файл всегда меньше по размерам чем соответствующий ЕХЕ – файл. Причина
этого – отсутствие заголовка.
Формат .СОМ используется в основном при написании программ, резидентных в
памяти (драйверов, обработчиков прерываний).
Программу формата .СОМ можно получить из бинарного файла с помощью TLINK c
опцией /t:
TLINK.EXE HELLO.OBJ /t
При составлении программы следует учитывать, что:
1. Стек и сегмент данных отсутствуют. Данные должны быть определены в сегменте
команд.
2. Директива ORG 100h резервирует 100h байт от начала адреса под PSP и устанавливает
относительный адрес для начала выполнения программы.
3. Программный загрузчик устанавливает этот адрес в указатель команд IP.
4. Если данные размещены в начале программы, то необходимо, чтобы первой командой
программы была команда JMP, необходимая для обхода данных, если они размещены в
начале программы.
5. Можно кодировать элементы данных в конце программы, тогда первая команда JMP
не требуется. Но кодирование данных перед командами позволяет ускорить процесс
ассемблирования и является хорошим стилем, рекомендуемым в руководствах по
ассемблеру.
6. Т.к. стек в исходной программе не задаётся, то компоновщик TLINK выдаётся
сообщение: WARNING: No STAK Segment (Предупреждение: Нет Сегмента Стека) – это
сообщение можно игнорировать.
7. Программа должна быть завершена либо командой RET, либо прерыванием INT 20h.
( Что в принципе одно и тоже т.к. при RET возвращается на первое слово PSP, где
записано INT 20h ). Кроме того, не является ошибкой завершение программы процедурой:
MOV AX, 4C00H ;В регистр AH помещаем 4Ch, в AL – 00h.
INT 21H ;Завершение программы

Пример программы HELLO. Данные размещаются перед кодом программы:


DOSSEG
.MODEL TINY
. CODE
ORG 100H ;Программа начинается с адреса 100h
Start: JMP Begin
; Данные программы
HELLO DB 'HELLO, WORLD!$'
;Код программы
Begin: MOV DX, offset HELLO ;В DX адрес строки.
MOV AH, 9 ;Номер функции DOS.
INT 21H ;Обращение к функции DOS.
; Выход из программы
INT 20h

END Start

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


Любая программа содержит специальную системную таблицу – префикс
программного сегмента (PSP), имеющего размер 256 (100h) байт.
В программах типа .СОМ место под PSP резервирует программист, начиная
программу директивой ORG 100h. PSP включается, таким образом, в состав
единственного сегмента программ.
Образ памяти программы типа .COM следующий:

CS, DS, ES, SS

PSP IP
Программы
и данные

Стек SP = FFFEh

В программах типа .EXE место под PSP не резервируется; он


«пристраивается» к программе в процессе её загрузки.
При загрузке программы типа .EXE сегменты размещаются в памяти следующим
образом:

ES, DS

CS PSP IP
Программмый
сегмент
Сегмент
SS
данных
Сегмент
SP

Адресуемым и это сегмент позволяет сделать Инициализация регистра DS в


начале программы:

mov ax, @ DATA


mov ds, ax

Программы обоих типов загружаются для выполнения с использованием одного и


того же механизма, обеспечиваемого модулем «загрузчика» COMMAND.COM функцией
Exec. Сначала строится префикс программного сегмента (Program Segment Prefix – PSP),
затем записывается текст модуля и устанавливаются сегментные регистры.
Область PSP начиная с 80h важна для программирования, т.к. сюда DOS помещает
хвост команды, т.е. параметры команды, если они содержались в командной строке
запуска программы.
В первом байте (адрес 80h) содержится число, указывающее длину хвоста без
учёта кода 0D (ENTER). Начиная со второго байта, размещаются сами параметры в виде
символьной строки.
Например, если введена команда без операндов (>TASM.EXE) после того как
DOS построит PSP, он установит в буфере с адреса 80h значение 00 0D. Первый байт –
содержит число байт, введённых с клавиатуры после имени файла; второй байт –
содержит код ENTER = 0Dh.
Например, если с помощью команды передаются ключи, управляющие её
работой, а также имена рабочих файлов. Так, программа P.EXE могла быть запущена
командой:
> TASM.EXE C:\LAB.ASM/z
Здесь передаётся имя и место расположения рабочего файла LAB.ASM и ещё
передаётся ключ /z.

Начиная с ES:80h имеем:

Адрес 80: 81 82 83 84 85 86 87 88 89 9A 9B 9C 9D 9E
Код 0D 20 43 3А 5С 4C 41 42 2E 41 41 54 2F 7A 0D
Символ ˽ С : \ L A B . A S M / z <ENTER>
Анализ параметров команды.

Поместим 80h в регистр SI и будем извлекать побайтно.

MOV SI, 80h ; Адрес DTL


CMP BYTE PTR ES: [SI],0 ; в буфере 0 ?
JZ EXIT ; выйдем, если ничего нет и извлекаем.

Рассмотрим пример, когда основная программа запускается, если нет параметров. Если
есть параметры, то они анализируются. Полагаем, что параметром вызывающим текст
описания программы будет “ / h”. Содержимое «хвоста» команды:

Адрес 80: 81 82 83 84
Код 0D 20 2F 68 0D
Символ ˽ / h <ENTER>

START:
MOV AH, ES: [80h]
CMP AH, 0
JZ MAIN
CMP BYTE PTR ES: [82], ‘/’
JNZ _ERR1

CMP BYTE PTR ES: [83], ‘h’


JZ HELP_
В представленном фрагменте анализа «хвоста» предполагается:
a) при отсутствии параметров происходит переход на выполнение основного кода
программы – JMP MAIN;
b) при распознавании заданного параметра происходит переход на выполнение кода
вывода на экран служебного сообщения – JMP HELP_;
c) при не распознавании заданного параметра происходит переход на выполнение
кода вывода на экран служебного сообщения об ошибке параметра – JMP ERR1.

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

Задания к лабораторной работе

Выполнить указанные ниже действия. Результаты представить в отчете.


Задание1. Наберите программу HELLO.ASM в .СОМ формате и в .EXE формате.
Создайте исполняемые модули и сравните их размер.

Задание2. В программе HELLO.ASM в .СОМ формате предусмотрите вывод сообщение


о назначении программы по ключу /h.
Задание3. Измените программу из контрольной работы, так чтобы она дополнительно
переписывала текст в обратном порядке. Внесите в текст программы анализ «хвоста».
При запуске программы без ключей программа выводит информацию об используемых
ключах:
/h – программа выводит информацию о назначении программы;
/f – программа переписывает текст в прямом порядке;
/r – программа переписывает текст в обратном порядке.
При

Вам также может понравиться