чем отличаются команды типо EXE от СОМРАЗЛИЧИЯ МЕЖДУ ПРОГРАММАМИ В EXE и COM-файлах
------------------------------------------------------------
Несмотря на то, что EXE2BIN преобразует EXE-файл в
COM-файл, cуществуют определенные различия между программой,
выполняемой как EXE-файл и программой, выполняемой как
COM-файл.
Размер программы. EXE-программа может иметь любой размер,
в то время как COM-файл ограничен размером одного сегмента и
не превышает 64К. COM-файл всегда меньше, чем соответствую
щий EXE-файл; одна из причин этого - отсутствие в COM-файле
512-байтового начального блока EXE-файла.
Сегмент стека. В EXE-программе определяется сегмент сте
ка, в то время как COM-программа генерирует стек автоматичес
ки. Таким образом при создании ассемблерной программы,
которая будет преобразована в COM-файл, стек должен быть
опущен.
Сегмент данных. В EXE программе обычно определяется сег
мент данных, а регистр DS инициализируется адресом этого
сегмента. В COM-программе все данные должны быть определены
в сегменте кода. Ниже будет показан простой способ решения
этого вопроса.
Инициализация. EXE-программа записывает нулевое слово в
стек и инициализирует регистр DS. Так как COM-программа не
имеет ни стека, ни сегмента данных, то эти шаги отсутствуют.
Когда COM-программа начинает работать, все сегментные ре
гистры содержат адрес префикса программного сегмента (PSP),
- 256-байтового (шест. 100) блока, который резервируется
операционной системой DOS непосредственно перед COM или EXE
программой в памяти. Так как адресация начинается с шест.
смещения 100 от начала PSP, то в программе после оператора
SEGMENT кодируется директива ORG 100H.
Обработка. Для программ в EXE и COM форматах выполняется
ассемблирование для получения OBJ-файла, и компановка для
получения EXE-файла. Если программа создается для выполнения
как EXE-файл, то ее уже можно выполнить. Если же программа
создается для выполнения как COM-файл, то компановщиком
будет выдано сообщение:
Warning: No STACK Segment
(Предупреждение: Сегмент стека не определен)
Это сообщение можно игнорировать, так как определение стека
в программе не предполагалось. Для преобразования EXE-файла
в COM-файл используется программа EXE2BIN. Предположим, что
EXE2BIN имеется на дисководе A, а скомпанованный файл по
имени CALC.EXE - на дисководе B. Введите
EXE2BIN B:CALC,B:CALC.COM
Так как первый операнд всегда предполагает EXE файл, то
можно не кодировать тип EXE. Второй операнд может иметь
другое имя (не CALC.COM). Если не указывать тип COM, то
EXE2BIN примет по умолчанию тип BIN, который впоследствии
можно переименовать в COM. После того как преобразование
будет выполнено можно удалить OBJ- и EXE-файлы.
Если исходная программа написана для EXE-формата, то мож
но, используя редактор, заменить команды в исходном тексте
для COM файла.
ПРИМЕР COM-ПРОГРАММЫ
------------------------------------------------------------
Программа EXCOM1, приведенная на рис. 6.1, аналогична
программе на рис. 4.3, но изменена согласно требований COM-
формата. Обратите внимание на следующие изменения в этой
COM-программе:
- Стек и сегмент данных отсутствует.
- Оператор ASSUME указывает ассемблеру установить относи
тельные адреса с начала сегмента кодов. Регистр CS
также содержит этот адрес, являющийся к тому же адресом
префикса программного сегмента (PSP). Директива ORG
служит для резервирования 100 (шест.) байт от начально
го адреса под PSP.
- Директива ORG 100H устанавливает относительный адрес
для начала выполнения программы. Программный загрузчик
использует этот адрес для командного указателя.
- Команда JMP используется для обхода данных, определен
ных в программе.
Ниже показаны шаги для обработки и выполнения этой
программы:
MASM [ответы на запросы обычные]
LINK [ответы на запросы обычные]
EXE2BIN B:EXCOM1,B:EXCOM1.COM
DEL B:EXCOM1.OBJ,B:EXCOM1.EXE (удаление OBJ и EXE-файлов)
Размеры EXE- и COM-программ - 788 и 20 байт соответствен
но. Учитывая такую эффективность COM-файлов, рекомендуется
все небольшие программы создавать для COM-формата. Для
трассировки выполнения программы от начала (но не включая)
команды RET введите DEBUG B:EXCOM1.COM.
Некоторые программисты кодируют элементы данных после
команд так, что первая команда JMP не требуется.
Кодирование элементов данных перед командами позволяет
ускорить процесс ассемблирования и является методикой,
рекомендуемой в руководстве по ассемблеру.