Несмотря на то, что существуют служебные программы, например EXE2BIN, которые преобразует ЕХЕ -файл в СОМ -файл, однако нужно знать определенные различия между программой, выполняемой как ЕХЕ -файл и программой, выполняемой как СОМ-файл.
1. Размер программы.
Программа в формате ЕХЕ может иметь любой размер, в то время как СОМ-файл ограничен размером одного сегмента и не превышает 64 К. Размер СОМ-файла всегда меньше, чем размер соответствующего ЕХЕ-файла; одна из причин этого - отсутствие в СОМ-файле 512-байтового заголовка ЕХЕ-файла (префикса программного сегмента, PSP).
2. Сегмент стека.
В ЕХЕ-программе определяется сегмент стека, в то время как СОМ-программа генерирует стек автоматически. Таким образом, при создании ассемблерной программы, которая будет преобразована в СОМ-файл, стек должен быть опущен.
3. Сегмент данных.
В ЕХЕ- программе обычно определяется сегмент данных, а регистр DS инициализируется адресом этого сегмента. В СОM-программе все данные должны быть определены в сегменте кода.
4. Инициализация.
В ЕХЕ-программе выполняются запись нулевого слова в стек и инициализация регистра DS. Так как в СОМ-программе стек и сегмент данных не определены, то эти шаги отсутствуют. Когда СОМ-программа начинает работать, все сегментные регистры содержат адрес префикса программного сегмента (PSP) - 256-байтовый (100Н) блок, который резервируется операционной системой DOS непосредственно перед СОМ- или ЕХЕ-программой в памяти. Так как адресация начинается со смещения 100Н от начала PSP, то в программе после оператора SEGMENT кодируется директива ORG 100Н.
5. Обработка.
Для программ в ЕХЕ- и СОМ-форматах выполняются:
a) ассемблирование для получения OBJ-файла:
Для TASM:
tasm /z /zi /l prog.asm
кроме файла: prog.obj дополнительно создается:
файл.lst (листинг программы (опция /l);
выводится исходный текст вместе с сообщением об ошибках (опция /z);
дополнительная информация для дебагера(опция /zi).
b) компоновка для получения ЕХЕ-файла:
Для TLINK:
tlink /v prog.obj
Создает:
файлы: prog.exe и prog.map
дополнительную информацию для дебагера (опция /v).
Если программа создается для выполнения как ЕХЕ-файл, то ее уже можно выполнить.
Если же программа создается для выполнения как СОМ-файл, то компоновщиком будет выдано сообщение:
Warning: No STACK Segment*
Это сообщение можно игнорировать, так как определение стека в программе не предполагалось.
Пример программы типа СОМ
Программа PROG, приведенная на рис.6.16, написана согласно требованиям СОМ-формата. Обратите внимание на следующие особенности в этой СОМ-программе:
• Сегмент стека и сегмент данных отсутствуют.
• Директива ORG служит для резервирования 100H байт от начального адреса под PSP.
• Директива ORG 100H устанавливает относительный адрес для начала выполнения программы. Программный загрузчик устанавливает этот адрес в командном указателе.
• Команда JMP служит для обхода данных, определенных в программе.
Размеры ЕХЕ- и СОМ-программ - 788 и 20 байт соответственно. Учитывая такую эффективность СОМ-файлов, рекомендуется все небольшие программы создавать в СОМ-формате.
Некоторые программисты кодируют элементы данных после команд так, что первая команда JMP не требуется. Кодирование элементов данных перед командами позволяет ускорить процесс ассемблирования и является хорошим стилем, рекомендуемым в руководствах по ассемблеру.
;Программа Prog
;Программа складывает два числа и завершается
.MODEL TINY ; модель памяти, используемая для СОМ .CODE [SEGMENT] ; начало сегмента кода ORG 100H ; начальное значение счетчика - 100h, конец PSP