Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
EXE - формата
Методические указания
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 ;Завершение программы
END Start
PSP IP
Программы
и данные
Стек SP = FFFEh
ES, DS
CS PSP IP
Программмый
сегмент
Сегмент
SS
данных
Сегмент
SP
Адрес 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>
Анализ параметров команды.
Рассмотрим пример, когда основная программа запускается, если нет параметров. Если
есть параметры, то они анализируются. Полагаем, что параметром вызывающим текст
описания программы будет “ / 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